13.4 建造者模式
我想构建一个小人,作为人,我们有两只手,两个脚,一个脑袋,这个是固定的。但是人的高矮胖瘦不一样。
建造者模式可将一个产品的内部表象和产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
使用该模式,用户只需指定需要建造的类型就可以得到它们,具体建造过程和细节就不需知道了。
先定义一个抽象的造人的类(有头、身体、四肢),把这个建造过程稳定住,不让任何人遗忘当中的任何一步。
public abstract class PersonBuilder {
protected Graphics g;
protected Pen p;
public PersonBuilder(Graphics g,Pen p){
this.g = g;
this.p = p;
}
public abstract void buildHead();
public abstract void buildBody();
public abstract void buildArmLeft();
public abstract void buildArmRight();
public abstract void buildLegLeft();
public abstract void buildLegRight();
}
我们需要建造一个瘦的人,就得让这个瘦子类继承这个抽象类,然后必须重写这些抽象方法。
public class PersonThinBuilder extends PersonBuilder {
public PersonThinBuilder(Graphics g,Pen p){
super(g,p);
}
@Override
public void buildHead(){
//...画画
}
@Override
public abstract void buildBody(){
//...画画
}
@Override
public abstract void buildArmLeft(){
//...画画
}
//...
}
类似的胖子或高个子就都是类似的
但是,客户端在调用时,还是需要知道头、身子、四肢这些方法的。
解决办法就是构建一个指挥者(Director)类,用它来控制建造过程,用它来隔离用户和建造过程的关联。
public class PersonDirector {
private PersonBuilder pb;
//用户告诉指挥者,我需要什么样的小人
public PersonDirector(PersonBuilder pb){
this.pb = pb;
}
//根据用户选择来建造小人
public void createPerson(){
pb.buildHead();
pb.buildBody();
pb.buildArmLeft();
pb.buildArmRight();
pb.buildLegLeft();
pb.buildLegRight();
}
}
PersonDirector类就是根据用户选择来建造小人,建造过程在指挥者这里完成,用户无需知道内部过程,并且过程每一步都设置好,不会出现遗忘某一步的问题。
//客户端
public class Main {
public static void main(String[] args){
//创建瘦子的
PersonThinBuilder ptb = new PersonThinBuilder(p,b);
PersonDirector thinDirector = new PersonDirector(ptb);
thinDirector.createPerson();
//...创建胖子的
}
}
13.5 建造者模式解析
Builder是什么
是为创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder是什么
具体建造者,实现Builder接口,可以有多个不同实现的具体建造者。负责构造和装配各个部件。
Product就是具体的小人、产品等等。
Director是什么
指挥者,用来根据用户的需求构建小人对象。构建一个使用Builder接口的对象。
什么使用用建造者模式
用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建面临复杂变化。
好处
使建造代码和表示代码分离,建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需再定义一个具体的建造者即可。
13.6 建造者模式基本代码
Product类–产品类,由多个部件组成
public class Product {
List<String> parts = new ArrayList<String>();
//添加产品部件
public void add(String part){
parts.add(part);
}
//列举所有产品部件
public void show(){
for(String part : parts){
println(part);
}
}
}
Builder类–抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法getResult()
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
ConcreteBuilder类–具体建造者类,可有多个
//构造具体的两个部件是部件A和部件B
public class ConcreteBuilder extends Builder {
private Product product = new Product();
@Override
public void buildPartA(){
product.add("部件A");
}
@Override
public void buildPartB(){
product.add("部件B");
}
@Override
public Product getResult(){
return product;
}
}
Director类–指挥者类
public class Director {
//指挥建造过程
public void construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
}
}
客户端代码
public class Main {
public static void main(String[] args){
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
//指挥者用ConcreteBuilder1的方法来建造产品
director.construct(b1);
Product p1 = b1.getResult();
p1.show();
}
}
建造模式是在当创建复杂对象的算法应独立于该对象的组成部分及它们的装配方式时适用的模式。