设计模式之建造者模式

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();
		
	














以上是关于设计模式之建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式从青铜到王者第八篇:创建型模式之建造者模式(BuilderPattern)

建造者模式

建造者模式

java设计模式3.建造者模式原型模式

创建型模式之建造者模式实例及代码操作

23种设计模式:建造者模式