建造者模式(BuilderPattern)也叫做生成器模式
基本概念 1.定义 1.1 标准定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
2.适用场景 (1)相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
(2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式
(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
(4)在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计的最初目标。
3.优劣 3.1 优点
4.登场角色
4.1 Product(产品类) 通常是实现了模板方法模式,也就是有模板方法和基本方法。
4.2 Builder(抽象建造者) 规范产品的组建,一般是由子类实现。
定义生成实例的接口
4.3 ConcreteBuilder(具体建造者) 实现抽象类定义的所有方法,并且返回一个组建好的对象。
4.4 Director(导演类) 负责安排已有模块的顺序,然后告诉Builder开始建造。
导演类起到封装的作用,避免高层模块深入到建造者内部的实现类。当然,在建造者模式比较庞大时,导演类可以有多个。
代码实例 车辆模型实例
1.产品类
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 public abstract class CarModel { private ArrayList<String> sequence = new ArrayList <String>(); protected abstract void start () ; protected abstract void stop () ; protected abstract void alarm () ; protected abstract void engineBoom () ; final public void run () { for (int i=0 ;i<this .sequence.size();i++){ String actionName = this .sequence.get(i); if (actionName.equalsIgnoreCase("start" )){ this .start(); }else if (actionName.equalsIgnoreCase("stop" )){ this .stop(); }else if (actionName.equalsIgnoreCase("alarm" )){ this .alarm(); }else if (actionName.equalsIgnoreCase("engine boom" )){ this .engineBoom(); } } } final public void setSequence (ArrayList<String> sequence) { this .sequence = sequence; } }
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 public class BMWModel extends CarModel { @Override protected void alarm () { System.out.println("宝马车的喇叭声音是这个样子的..." ); } @Override protected void engineBoom () { System.out.println("宝马车的引擎室这个声音的..." ); } @Override protected void start () { System.out.println("宝马车跑起来是这个样子的..." ); } @Override protected void stop () { System.out.println("宝马车应该这样停车..." ); } }
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 public class BenzModel extends CarModel { @Override protected void alarm () { System.out.println("奔驰车的喇叭声音是这个样子的..." ); } @Override protected void engineBoom () { System.out.println("奔驰车的引擎室这个声音的..." ); } @Override protected void start () { System.out.println("奔驰车跑起来是这个样子的..." ); } @Override protected void stop () { System.out.println("奔驰车应该这样停车..." ); } }
2.建造者
1 2 3 4 5 6 7 8 9 10 11 12 public abstract class CarBuilder { public abstract void setSequence (ArrayList<String> sequence) ; public abstract CarModel getCarModel () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class BMWBuilder extends CarBuilder { private BMWModel bmw = new BMWModel (); @Override public CarModel getCarModel () { return this .bmw; } @Override public void setSequence (ArrayList<String> sequence) { this .bmw.setSequence(sequence); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class BenzBuilder extends CarBuilder { private BenzModel benz = new BenzModel (); @Override public CarModel getCarModel () { return this .benz; } @Override public void setSequence (ArrayList<String> sequence) { this .benz.setSequence(sequence); } }
3.导演类 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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 public class Director { private ArrayList<String> sequence = new ArrayList <String>(); private BenzBuilder benzBuilder = new BenzBuilder (); private BMWBuilder bmwBuilder = new BMWBuilder (); public BenzModel getABenzModel () { this .sequence.clear(); this .sequence.add("start" ); this .sequence.add("stop" ); this .benzBuilder.setSequence(this .sequence); return (BenzModel)this .benzBuilder.getCarModel(); } public BenzModel getBBenzModel () { this .sequence.clear(); this .sequence.add("engine boom" ); this .sequence.add("start" ); this .sequence.add("stop" ); this .benzBuilder.setSequence(this .sequence); return (BenzModel)this .benzBuilder.getCarModel(); } public BMWModel getCBMWModel () { this .sequence.clear(); this .sequence.add("alarm" ); this .sequence.add("start" ); this .sequence.add("stop" ); this .bmwBuilder.setSequence(this .sequence); return (BMWModel)this .bmwBuilder.getCarModel(); } public BMWModel getDBMWModel () { this .sequence.clear(); this .sequence.add("start" ); this .bmwBuilder.setSequence(this .sequence); return (BMWModel)this .benzBuilder.getCarModel(); } }
4.Client 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class Client { public static void main (String[] args) { Director director = new Director (); for (int i=0 ;i<10000 ;i++){ director.getABenzModel().run(); } for (int i=0 ;i<1000000 ;i++){ director.getBBenzModel().run(); } for (int i=0 ;i<10000000 ;i++){ director.getCBMWModel().run(); } } }