我们都听过女娲挥鞭造人的故事,现在我们就以此来解释建造者模式。
建造者模式
主要由 4 部分组成:
(1)产品(Product):包含组成产品的各个部件。
(2)抽象建造者(Builder):具有创建产品各个部件的抽象方法,通常还包含一个返回组成产品的方法。
(3)具体建造者(Concrete Builder):实现 Builder 接口,完成产品各个部件的具体创建方法。
(4)指挥者(Director):调用 Builder 对象中的各个部件的构造与组装方法完成产品的创建。
// 产品(Product):人(具有所有组成部分:头部、躯体、四肢)
public class Person{
// 头部
private String head;
// 躯体
private String body;
// 四肢
private String limb;
// 省略 getter/ setter
@Override
public String toString(){
StringBuilder sb = new StringBuilder("此人具有:");
sb.append(this.head).append(",");
sb.append(this.body).append(",");
sb.append(this.limb);
return sb.toString();
}
}
// 抽象建造者(Builder):鞭子(包含创建产品部件的抽象方法和返回组成产品的方法)
public abstract class BianZi{
protected Person person = new Person();
public abstract void createHead();
public abstract void createBody();
public abstract void createLimb();
/*
public abstract Person assemblePerson();
可将 assemblePerson 定义为抽象方法,在 BianZi 的 子类 ManBuilder 具体实现。
*/
public Person assemblePerson(){
return person;
}
}
// 具体组建者(ConcreteBuilder):男人(实现了各个部件的具体创建)
public class ManBuilder extends BianZi{
public void createHead(){
person.setHead("男人头");
}
public void createBody(){
person.setBody("男人身躯");
}
public void createLimb(){
person.setLimb("男人五肢");
}
/*
// 若 Person 有子类,可用其子类代替 new Person();
protected Person person = new Person();
@Override
public Person assemblePerson(){
...
return person;
}*/
}
// 具体组建者(ConcreteBuilder):女人(实现了各个部件的具体创建)
public class WomanBuilder extends BianZi{
public void createHead(){
person.setHead("女人头");
}
public void createBody(){
person.setBody("女人身躯");
}
public void createLimb(){
person.setLimb("女人四肢");
}
}
// 指挥者(Director): (女娲)调用Builder(鞭子)方法完成各个部件的构建并组装成人
public class NvWa{
private BianZi bianZi;
public NvWa(BianZi bianZi){
this.bianZi = bianZi;
}
// 创建各部位并组装
public Person getPerson(){
bianZi.createHead();
bianZi.createBody();
bianZi.createLimb();
return bianZi.assemblePerson();
}
}
public class Test{
public static void main(String[] args){
NvWa nvWa = new NvWa(new ManBuilder());
Person person1 = nvWa.getPerson();
System.out.println(person1); //此人具有:男人头,男人身躯,男人五肢
NvWa nvWa2 = new NvWa(new WomanBuilder());
Person person2 = nvWa2.getPerson();
System.out.println(person2); //此人具有:女人头,女人身躯,女人四肢
}
}