一,什么是建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
二,例子
四个要素
产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
具体建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
具体产品类House:
/**
*
* @类名称:House
* @类描述:具体产品
* @创建人:zender
*/
public class House {
// 地板
private String floor;
// 墙
private String wall;
// 屋顶
private String housetop;
public String getFloor() {
return floor;
}
// get/set忽略
}
抽象建造者Builder:
/**
*
* @类名称:HouseBuilder
* @类描述:抽象建造者Builder
* @创建人:zender
*/
public interface HouseBuilder {
//修地板
public void makeFloor();
//修墙
public void makeWall();
//修屋顶
public void makeHousetop();
public House getHouse();
}
具体建造者Builder:
/**
*
* @类名称:GongyuBuilder
* @类描述:具体建造者Builder
* @创建人:zender
*/
public class GongyuBuilder implements HouseBuilder {
House house = new House();
public House getHouse() {
return house;
}
public void makeFloor() {
house.setFloor("公寓-->地板");
}
public void makeHousetop() {
house.setHousetop("公寓-->房顶");
}
public void makeWall() {
house.setWall("公寓-->墙");
}
}
导演类Director:
/**
*
* @类名称:HouseDirector
* @类描述:导演类Director
* @创建人:zender
*/
public class HouseDirector {
public void makeHouse(HouseBuilder builder) {
builder.makeFloor();
builder.makeWall();
builder.makeHousetop();
}
}
测试类:
public class Test {
public static void main(String[] args) {
//由工程队来修房子
HouseBuilder builder = new GongyuBuilder();
//设计者来做设计
HouseDirector director = new HouseDirector();
director.makeHouse(builder);
House house = builder.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getWall());
System.out.println(house.getHousetop());
}
}
结果:

三、建造者模式应用场景
- 对象的创建
Builder模式是为对象的创建而设计的模式
- 创建的是一个复合对象
创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
四,使用建造者模式的好处
1,使用建造者模式可以使客户端不必知道产品内部组成的细节。
2,具体的建造者类之间是相互独立的,对系统的扩展非常有利。
3,由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
来源:https://www.cnblogs.com/Zender/p/7357314.html