设计模式之建造者模式

设计模式之建造者模式

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














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值