Java设计模式之建造者模式
Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
- Dircector:设计者类。该类的作用是指挥建造者对象动态的建造产品。
- Builder:建造者类。执行真正的建造工作。
- ConcreteBuilder:具体建造者类。包含具体的工作细节。
- Product:产品类。通过建造者类建造出来的产品。
实际上建造者设计模式和工厂设计模式很相似,只不过建造者模式多了一个设计者类。下面我们来实现一个简单的案例,作为一个简单的案例,代码中没有编写抽象建造者类,但是并不妨碍对于建造者类的理解。
产品类
/*
* 定义一个房子产品类
* 房子需要地板(floor)、墙面(wall)和屋顶(roof)
* */
class House{
private String floor;
private String wall;
private String roof;
public void setFloor(String floor) {
this.floor = floor;
}
public void setWall(String wall) {
this.wall = wall;
}
public void setRoof(String roof) {
this.roof = roof;
}
public String toString(){
return "House:["+floor+","+wall+","+roof+"]。";
}
}
建造者类
/*
* 定义一个建造者类,传递产品类进去进行生产
* 把它当做一个工程队
* 建造者类有能力完成建房子的任务
* 但是它并没有房子的设计图
* */
class HouseBuilder{
private House house;
public HouseBuilder(House house){
this.house = house;
}
public void cBuildFloor() {
house.setFloor("Use Cheapfloor");
}
public void cBuildWall() {
house.setRoof("Use Cheapfloor");
}
public void cBuildRoof() {
house.setWall("Use CheapWall");
}
public void eBuildFloor() {
house.setFloor("Use Expenfloor");
}
public void eBuildWall() {
house.setRoof("Use Expenfloor");
}
public void eBuildRoof() {
house.setWall("Use ExpenWall");
}
public House getHouse() {
return house;
}
}
设计者类
/*
* 定义设计者类
* 它提供一个设计图(design)给工程队(HouseBuilder)
* 这里按需求都使用了便宜的建造流程
* Cheap(便宜)、Expen(贵)
* */
class Director{
private HouseBuilder houseBuilder;
public Director(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}
public void design(){
houseBuilder.cBuildFloor();
houseBuilder.cBuildRoof();
houseBuilder.cBuildWall();
}
}
测试代码:
House house = new House();
HouseBuilder builder = new HouseBuilder(house);
Director director = new Director(builder);
director.design();
/*
* 向工程队要取房子
* */
System.out.println(builder.getHouse());
/*
* Output:
House:[Use Cheapfloor,Use CheapWall,Use Cheapfloor]。
* */