建造者模式
1. 什么是建造者模式?
建造者模式属于创造型模式,它是将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。
举例:
普通房子和高楼,两者都很难建造,但也有相似点:打地基、砌墙、盖屋顶。
普通房子的地基5m,墙10cm;高楼的地基100m,墙20cm。
2. 建造者模式结构
- Product(产品角色):一个具体的产品对象
- Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类
- ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
- Director(指挥者):构建一个使用Builder接口的对象。主要是创建一个复杂的对象。主要作用是:一是隔离了客户与对象的生产过程;二是负责控制产品对象的生产过程。
3. Code
/**
* @author dingding
* 产品对象
*/
public class House {
private String basic;
private String wall;
private String roofed;
public String getBasic() {
return basic;
}
public void setBasic(String basic) {
this.basic = basic;
}
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;
}
}
/**
* @author dingding
* 抽象建造者
*/
public abstract class HouseBuilder {
protected House house = new House();
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void roofed();
public House buildHouse() {
return house;
}
}
/**
* @author dingding
* 具体构造者1
*/
public class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println(" 普通房子打地基5米 ");
}
@Override
public void buildWalls() {
System.out.println(" 普通房子砌墙10cm ");
}
@Override
public void roofed() {
System.out.println(" 普通房子屋顶 ");
}
}
/**
* @author dingding 具体构造者2
*/
public class HignHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println(" 高楼的打地基100米 ");
}
@Override
public void buildWalls() {
System.out.println(" 高楼的砌墙20cm ");
}
@Override
public void roofed() {
System.out.println(" 高楼的透明屋顶 ");
}
}
/**
* @author dingding
* 指挥者
*/
public class HouseDirector {
HouseBuilder houseBuilder = null;
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House constructHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.buildHouse();
return houseBuilder.buildHouse();
}
}
/**
* @author dingding
* 客户端
*/
public class Client {
public static void main(String[] args) {
CommonHouse commonHouse = new CommonHouse();
HouseDirector houseDirector = new HouseDirector(commonHouse);
House house = houseDirector.constructHouse();
System.out.println("----------------------");
HignHouse hignHouse = new HignHouse();
houseDirector.setHouseBuilder(hignHouse);
house = houseDirector.constructHouse();
}
}