场景:设计一个汽车简易制造工艺流程
该模块中主要包括两个部分:
1.汽车制造模型
2.汽车组装过程
建造者模式:
定义:将一个复杂对象的构建与它的标示分离,使得同样的构建过程可以创建不同的目标
在建造者模式中,有如下4个角色:
Produce产品类:
通常是实现了模版模式(Template);
Builder抽象建造者:
规范产品的组件,一般由子类实现;
ConcreteBuilder具体建造者:
实现抽象类定义的所有方法,并且返回一个组建好的对象;
Director导演类:
负载安排已有模块的顺序,然后告诉Builder开始建造。
场景问题解决类图:
主要涉及如下几个角色:
1.车辆模型的抽象类
2.奔驰模型
3.宝马模型
4.抽象汽车建造者
5.宝马建造者
6.奔驰建造者
7.导演类
8.场景类
代码实现:
CarModel:
public abstract class CarModel { private ArrayList<String> squence = new ArrayList<String>(); protected abstract void start(); protected abstract void stop(); protected abstract void alarm(); protected abstract void engieBoom(); final public void run() { for (int i = 0; i < squence.size(); i++) { String actionName = this.squence.get(i); if (actionName.trim().equalsIgnoreCase("start")) { this.start(); }else if (actionName.trim().equalsIgnoreCase("stop")) { this.stop(); }else if (actionName.trim().equalsIgnoreCase("alarm")) { this.alarm(); }else if (actionName.trim().equalsIgnoreCase("engine alarm")) { this.engieBoom(); } } } final public void setSequence(ArrayList<String> sequence) { this.squence = sequence; } }
BenzModel:
public class BenzModel extends CarModel { @Override protected void start() { // TODO Auto-generated method stub } @Override protected void stop() { // TODO Auto-generated method stub } @Override protected void alarm() { // TODO Auto-generated method stub } @Override protected void engieBoom() { // TODO Auto-generated method stub } }
BWMModle:
public class BWMModel extends CarModel { @Override protected void start() { // TODO Auto-generated method stub } @Override protected void stop() { // TODO Auto-generated method stub } @Override protected void alarm() { // TODO Auto-generated method stub } @Override protected void engieBoom() { // TODO Auto-generated method stub } }
CarBuilder:
public abstract class CarBuild { public abstract void setSequence(ArrayList<String> sequence); public abstract CarModel getCarModel(); }
BenzBuilder:
public class BenzBuild extends CarBuild { private BenzModel benzModel = new BenzModel(); @Override public void setSequence(ArrayList<String> sequence) { this.benzModel.setSequence(sequence); } @Override public CarModel getCarModel() { return this.benzModel; } }
BWMBuilder:
public class BWMBuild extends CarBuild { private BWMModel bwmModel = new BWMModel(); @Override public void setSequence(ArrayList<String> sequence) { this.bwmModel.setSequence(sequence); } @Override public CarModel getCarModel() { // TODO Auto-generated method stub return this.bwmModel; } }
Director:
public class Director { private ArrayList<String> sequence = new ArrayList<String>(); private BenzBuild benzBuild = new BenzBuild(); private BWMBuild bwmBuild = new BWMBuild(); public BenzModel getABenzModel() { this.sequence.clear(); this.sequence.add("start"); this.sequence.add("stop"); this.benzBuild.setSequence(sequence); return (BenzModel)this.benzBuild.getCarModel(); } public BenzModel getBBenzModel() { this.sequence.clear(); this.sequence.add("engine boom"); this.sequence.add("start"); this.sequence.add("stop"); this.benzBuild.setSequence(sequence); return (BenzModel) this.benzBuild.getCarModel(); } public BWMModel getBwmModel() { this.sequence.clear(); this.sequence.add("start"); this.sequence.add("stop"); this.bwmBuild.setSequence(sequence); return (BWMModel) bwmBuild.getCarModel(); } }
Client:
public class Client { public static void main(String[] agrs) throws Exception { Director director = new Director(); director.getABenzModel().run(); director.getBBenzModel().run(); director.getBwmModel().run(); } }
建造者的优点:
1.使用建造者模式可以使得客户端不必知道产品内部组成的细节;
2.建造者独立,容易扩展;
3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
建造者模式的使用场景
1.相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用;
2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用;
3.产品类非常复杂,或者产品类中调用顺序不同产生了不同的效果;
4.在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用。