设计模式之建造者模式
建造者模式(Builder Pattern)也叫生成器模式,定义:Separate the construction of complex object from its representation so that the same construction process can create different representations.(将一个复杂的对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示)
通用类图
4个角色
1.Product产品类:通常是实现了模板方法模式,也就是有模板方法和基本方法;
2.Builder抽象建造者类:规范产品的组件,一般是由子类实现;
3.ConcreteBuilder具体建造者类:实现抽象类定义的所有方法,并且返回一个组建好的对象;
4.Director导演类:负责安排已有模块的顺序,然后告诉Build开始建造。
产品类
public class Product { public void doSomething(){ } } 抽象建造者类 public abstract class Builder { //设置产品的不同部分,以获得不同的产品 public abstract void setPart(); //建造产品 public abstract Product buildProduct(); } 具体建造者类 public class ConcreteProduct extends Builder{ private Product product=new Product(); //设置产品零件 public void setPart(){ } //组建一个产品 public Product buildProduct(){ return product; } } 导演类 public class Director { private Builder builder=new ConcreteProduct(); //构建不同的产品 public Product getAProduct(){ builder.setPart(); return builder.buildProduct(); } }建造者模式优点:
1.封装性,使用建造者模式,可以使得客户端不必知道产品内部组成细节;
2.建造者独立,容易扩展;
3.便于控制细节风险,由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
建造者模式使用场景
1.相同的方法,不同的执行顺序,产生不同的事件结果;
2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同;
3.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的功效;
4.对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时;
注意事项
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大的不同。
例子:不同汽车可以随意设置不同启停模式
汽车抽象类
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; } } 奔驰模型 public class BenzModel extends CarModel{ protected void start(){ System.out.println("启动"); } protected void stop(){ System.out.println("停止"); } protected void alarm(){ System.out.println("报警"); } protected void engineBoom(){ System.out.println("发动机"); } } 宝马模型 public class BWMModel extends CarModel{ protected void start(){ System.out.println("启动"); } protected void stop(){ System.out.println("停止"); } protected void alarm(){ System.out.println("报警"); } protected void engineBoom(){ System.out.println("发动机"); } } 抽象组装类 public abstract class CarBuilder { //给定顺序 public abstract void setSequence(ArrayList<String>sequence); //返回模型 public abstract CarModel getCarModel(); } 奔驰组装类 public class BenzBuilder extends CarBuilder{ private BenzModel benz=new BenzModel(); public CarModel getCarModel(){ return this.benz; } public void setSequence(ArrayList<String> sequence){ this.benz.setSequence(sequence); } } 宝马组装类 public class BWMBuilder extends CarBuilder{ private BWMModel bwm=new BWMModel(); public CarModel getCarModel(){ return this.bwm; } public void setSequence(ArrayList<String> sequence){ this.bwm.setSequence(sequence); } } 导演类 public class Director { private ArrayList<String> sequence=new ArrayList(); private BenzBuilder benzbuilder=new BenzBuilder(); private BWMBuilder bwmbuilder=new BWMBuilder(); public BenzModel getABenzModel(){ this.sequence.clear(); this.sequence.add("start"); this.sequence.add("stop"); this.benzbuilder.setSequence(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(sequence); return (BenzModel)this.benzbuilder.getCarModel(); } public BWMModel getCBWMModel(){ this.sequence.clear(); this.sequence.add("alarm"); this.sequence.add("start"); this.sequence.add("stop"); this.bwmbuilder.setSequence(sequence); return (BWMModel)this.bwmbuilder.getCarModel(); } public BWMModel getDBWMModel(){ this.sequence.clear(); this.sequence.add("start"); this.bwmbuilder.setSequence(sequence); return (BWMModel)this.bwmbuilder.getCarModel(); } } 场景类 public class Client { public static void main(String[] args) { // TODO Auto-generated method stub Director director=new Director(); for(int i=0;i<10;++i){ director.getABenzModel().run(); } for(int i=0;i<10;++i){ director.getBBenzModel().run(); } for(int i=0;i<10;++i){ director.getCBWMModel().run(); } for(int i=0;i<10;++i){ director.getDBWMModel().run(); } } }
