设计模式之建造者模式

xiaoxiao2021-02-28  102

设计模式之建造者模式

    建造者模式(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(); } } }

转载请注明原文地址: https://www.6miu.com/read-74279.html

最新回复(0)