一、什么是建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
简单一点就是:
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]
与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。
建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。
举个简单的例子,如汽车,有很多部件,车轮,方向盘,发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一部汽车,这个装配过程也很复杂(需要很好的组装技术), builder模式就是为了将部件和组装分开。
建造者模式的结构
三、建造者模式应用场景
- 对象的创建:Builder模式是为对象的创建而设计的模式
- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
代码:
BuilerDirector.java
public class BuilerDirector {
public void construct(HouseBuiler h){
h.setWuDing();
h.setDiBan();
h.setYangTai();
}
}
House.java
public class House {
//地板
private String diban;
//阳台
private String yangtai;
//屋顶
private String wuding;
public House() {
super();
}
public House(String diban, String yangtai, String wuding) {
super();
this.diban = diban;
this.yangtai = yangtai;
this.wuding = wuding;
}
public String getDiban() {
return diban;
}
public void setDiban(String diban) {
this.diban = diban;
}
public String getYangtai() {
return yangtai;
}
public void setYangtai(String yangtai) {
this.yangtai = yangtai;
}
public String getWuding() {
return wuding;
}
public void setWuding(String wuding) {
this.wuding = wuding;
}
}
HouseBuiler.java
public interface HouseBuiler {
//修屋顶
public void setDiBan();
//修阳台
public void setYangTai();
//修屋顶
public void setWuDing();
//获取实体对象
public House getHouse();
}
Main.java
public class Main {
public static void main(String[] args) {
//由工程队来修
HouseBuiler h = new PingFangBuiler();
//设计者来做
BuilerDirector b = new BuilerDirector();
b.construct(h);
House bb = h.getHouse();
System.out.println(bb.getDiban());
System.out.println(bb.getWuding());
System.out.println(bb.getYangtai());
}
}
PingFangBuiler.java
public class PingFangBuiler implements HouseBuiler {
House h = new House();
@Override
public void setDiBan() {
h.setDiban("平房——地板");
}
@Override
public void setYangTai() {
h.setYangtai("平房——阳台");
}
@Override
public void setWuDing() {
h.setWuding("平房——屋顶");
}
@Override
public House getHouse() {
return h;
}
}