建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
具体细节:
-
产品类:一般是一个较为复杂的对象,在创建过程中比较复杂,一般会有较多的代码量。
-
抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交给子类实现,可以扩展。
-
建造者:实现抽象建造者的方法。
-
调用者:负责调用建造者来生产产品。
建造者模式的简单例子
UML类图:
代码实现:
House代码:产品类
public class House {
//房子地基
private String base;
//房子围墙
private String wall;
//房子屋顶
private String roofed;
public String getBase() {
return base;
}
public void setBase(String base) {
this.base = base;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoofed() {
return roofed;
}
public void setRoofed(String roofed) {
this.roofed = roofed;
}
}
HouseBuilder类:抽象建造者
public abstract class HouseBuilder {
//生产产品
House house = new House();
public abstract void buildBase();
public abstract void buildWalls();
public abstract void buildRoofed();
public House build(){
return this.house;
}
}
CommonHouse类:具体建造者
public class CommonHouse extends HouseBuilder {
public void buildBase() {
System.out.println("建造普通地基");
}
public void buildWalls() {
System.out.println("建造普通围墙");
}
public void buildRoofed() {
System.out.println("建造普通房顶");
}
}
HouseDirector类:指挥者
public class HouseDirector {
private HouseBuilder houseBuilder;
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//创建产品
public House constructHouse(){
houseBuilder.buildBase();
houseBuilder.buildWalls();
houseBuilder.buildRoofed();
return houseBuilder.build();
}
测试类:
public class Client {
public static void main(String[] args) {
//创建普通房子
CommonHouse commonHouse = new CommonHouse();
//创建房子的指挥者
HouseDirector houseDirector = new HouseDirector(commonHouse);
//完成盖房子
House house = houseDirector.constructHouse();
}
}
总结
- 客户端不必知道产品内部组的细节,将产品本身ui产品的创建过程解耦,使得相同的创建过程可以创建不同的对象。
- 每一个具体建造者都相对独立,可以方便的替换具体建造者或增加具体建造者。
抽象工厂模式与建造者模式的区别
- 抽象工厂实现对产品家族的创建,不需要关心构建过程,只关心什么产品由什么工厂生产即可。
- 建造者模式则是要求按照指定的蓝图建造产品,他的目的是通过组装零配件生产一个新产品。