建造者设计模式 (BuilderPattern)
描述: 首先建造者设计模式是用来构建复杂的对象的,它主要强调的是当对于一个复杂对象的构建,比如当一个类的构造函数的参数超过4个的时候,且都是可变参数时侯考虑使用建造者设计模式。
核心思想: 当你的一个类需要很多的参数来构建时就可以把这些参数提取出来放在另一个类中进行构建
建造者设计模式的优点:
- 封装性
- 独立 , 易于扩展
- 便于控制细节风险,对建造过程逐步细化
建造者设计模式的使用场景:
- 相同的方法,不同的执行顺序产生不同的结果
- 多个零件或者部件,可以配置到多个对象中产生不同的效果
- 产品类中调用的顺序不同会产生不同的结果
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| abstract class TeaModel { public abstract void caiZhai();
public abstract void weiTiao();
public abstract void hunGan();
public abstract void nianRou();
public abstract void faJiao();
public abstract void ganZao();
public abstract void baoCun();
private List<String> list = new ArrayList<String>();
public void setCourse(ArrayList<String> list) { this.list = list; }
public void buildTea() { list.forEach(x -> { switch (x) { case "采摘": this.caiZhai(); break; case "萎调": this.weiTiao(); break; case "烘干": this.hunGan(); break; case "保存": this.baoCun(); break; case "干燥": this.ganZao(); break; case "发酵": this.faJiao(); break; case "揉捻": this.nianRou(); break; default: System.out.println("未知的操作"); break; } }); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class BlackTeaModel extends TeaModel {
@Override public void caiZhai() { System.out.println("红茶:采摘");
}
@Override public void weiTiao() { System.out.println("红茶:萎调");
}
@Override public void hunGan() { System.out.println("红茶:烘干");
}
@Override public void nianRou() { System.out.println("红茶:揉捻");
}
@Override public void faJiao() { System.out.println("红茶:发酵"); }
@Override public void ganZao() { System.out.println("红茶:干燥"); }
@Override public void baoCun() { System.out.println("红茶: 保存"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| abstract class AbstractTeaBuild {
public abstract void setCourse(ArrayList<String> list);
public abstract TeaModel getTea(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class BlackTeaBuilder extends AbstractTeaBuild {
private TeaModel tm = new BlackTeaModel();
@Override public void setCourse(ArrayList<String> list) { tm.setCourse(list); }
@Override public TeaModel getTea() { return tm; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class TeaMakeDirector { private AbstractTeaBuild ab = new BlackTeaBuilder(); private ArrayList<String> list = new ArrayList();
public BlackTeaModel getBlackTea() { list.clear(); list.add("采摘"); list.add("萎调"); list.add("揉捻"); list.add("发酵"); list.add("干燥"); ab.setCourse(list); return (BlackTeaModel) ab.getTea(); }
}
|
1 2 3 4 5 6 7 8 9 10
| public class test { public static void main(String[] args) { TeaMakeDirector teaMakeDirector = new TeaMakeDirector(); for (int i = 0; i <= 2; i++){ teaMakeDirector.getBlackTea().buildTea(); System.out.println("第"+i+ "杯红茶已好"); } } }
|
总结:
product就是最终要生成的对象 例如:(BlackTeaModel)
Builde就是建造者的抽象基类 例如:( AbstractTeaBuild )
ConcreteBuilde实现 Builde 例如:( BlackTeaBuilder)
Director: 决定如何构建最终产品的算法. 其会包含一个负责组装的方法(getBlackTea) 调用这个方法就相当于组装好了一个产品 例如(TeaMakeDirector)