设计模式之建造者模式
Posted 独孤九戒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之建造者模式相关的知识,希望对你有一定的参考价值。
设计模式之建造者模式
建造者模式(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();
以上是关于设计模式之建造者模式的主要内容,如果未能解决你的问题,请参考以下文章