设计模式之建造者模式
简介
在制作产品如盖楼房时,不同产品会有不同的方法,如盖普通房子和高楼大厦差别还是相当大的更别说地标性建筑了。那么在建造时如此大的差别该要如何设计模式完成呢。这就要用建造者模式了。
首先要建房子肯定要有个产品类House;接着是建造者HouseBuilder,HouseBuilder会建造的所有方法,但是不一定每个方法都要实现,所以用抽象类来表示;然后就是具体的建造方法实现如CommmonHouse和HighBuilding这两个实现类表示,最后就是指挥建造者如何建造了,即HouseDirector类就是操作HouseBuilder和他的实现方法,根据需要对HouseBuilder的各种方法顺序,数目的操作。
UML如下
House、HouseBuilder、HighBuilding、HouseDirector分别就是建造者模式的下面四个角色:
Product(产品角色): 一个具体的产品对象。
Builder(抽象建造者): 创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder(具体建造者): 实现抽象接口,构建和装配各个部件。
Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
1.产品类House
public class House {
private String diji;
private String zhuti;
private String zhuangxiu;
public House() {}
public House(String diji, String zhuti, String zhuangxiu) {
this.diji = diji;
this.zhuti = zhuti;
this.zhuangxiu = zhuangxiu;
}
public String getDiji() {return diji;}
public void setDiji(String diji) {this.diji = diji;}
public String getZhuti() {return zhuti;}
public void setZhuti(String zhuti) {this.zhuti = zhuti;}
public String getZhuangxiu() {return zhuangxiu;}
public void setZhuangxiu(String zhuangxiu) {this.zhuangxiu = zhuangxiu;} @Override
public String toString() {
return "House{" +
"diji='" + diji + '\'' +
", zhuti='" + zhuti + '\'' +
", zhuangxiu='" + zhuangxiu + '\'' +
'}';
}
}
产品类主要就是产品的属性
2.HouseBuilder
public abstract class HouseBuilder {
protected House house;
public HouseBuilder() {
this.house = new House();
}
public abstract void builderPartA();
public abstract void builderPartB();
public abstract void builderPartC();
public House buildeHouse(){return house;}
}
建造者要会这些方法去建设,同时确定最终的成品,根据产品的不同使用java的多态实现。
3.实现类
public class HighBuilding extends HouseBuilder {
@Override
public void builderPartA() {
super.house.setDiji("高楼地基");
System.out.println("高楼地基打好了");
}
@Override public void builderPartB() {
super.house.setZhuti("高楼主体");
System.out.println("高楼主体盖好了");
} @Override
public void builderPartC() {
super.house.setZhuangxiu("高楼装修");
System.out.println("高楼装修好了");
}
}
public class CommenHouse extends HouseBuilder {
@Override
public void builderPartA() {
super.house.setDiji("普通地基");
System.out.println("普通房地基打好了");
}
@Override
public void builderPartB() {
super.house.setZhuti("普通房子主体");
System.out.println("普通房主体盖好了");
}
@Override
public void builderPartC() {
super.house.setZhuangxiu("普通装修");
System.out.println("普通房装修好了");
}
}
就是具体实现HouseBuilder的方法,可以有多个,提供给HouseDirector操作。
4.指挥者
public class HouseDirector {
private HouseBuilder housebuilder = null;
public HouseDirector(HouseBuilder housebuilder) {
this.housebuilder = housebuilder;
}
public HouseBuilder getHousebuilder() {
return housebuilder;
}
public void setHousebuilder(HouseBuilder housebuilder) {
this.housebuilder = housebuilder;
}
public House contructHouse(){
housebuilder.builderPartA();
housebuilder.builderPartB();
housebuilder.builderPartC();
return housebuilder.buildeHouse();
}
}
在指挥者类里对建造者进行操作,根据需要对实现类各种方法数量,顺序等调整。如用instanceof 判断是什么类型房子然后根据判断执行不同的方法。
最终结果就是客户无需知道怎么实现,只要提供类型就能获得对应的产品。