`

建造者模式

阅读更多
一种场景:客户需要设计一个汽车模型,基本的功能有启动、停止、按喇叭、引擎这些功能,
执行的顺序由客户自己控制。
时间紧迫的情况下,我们设计出这种模型:

public abstract class CarModel {

	private ArrayList<String> sequence = new ArrayList<>();
	
	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"))
			{
				this.engineBoom();
			}
			
		}
		
	}

	public ArrayList<String> getSequence() {
		return sequence;
	}

	public void setSequence(ArrayList<String> sequence) {
		this.sequence = sequence;
	}
	
	//setSequence允许客户设置一个顺序,是先响喇叭还是先启动。对于一个具体的模型
	//永远是固定的,但是对于支持N个模型就是动态的了	
}


public class BenzModel extends CarModel{

	@Override
	protected void start() {
		System.out.println("BenzModel.start()");
	}

	@Override
	protected void stop() {
		System.out.println("BenzModel.stop()");
	}

	@Override
	protected void alarm() {
		System.out.println("BenzModel.alarm()");
	}

	@Override
	protected void engineBoom() {
		System.out.println("BenzModel.engineBoom()");
	}

	
}


public class BmwModel extends CarModel{

	@Override
	protected void start() {
		System.out.println("BmwModel.start()");
	}

	@Override
	protected void stop() {
		System.out.println("BmwModel.stop()");
	}

	@Override
	protected void alarm() {
		System.out.println("BmwModel.alarm()");
	}

	@Override
	protected void engineBoom() {
		System.out.println("BmwModel.engineBoom()");
	}

	
}




public class Client {

	public static void main(String[] args) {
	
		BenzModel benzModel = new  BenzModel();
		ArrayList<String> sequence =  new ArrayList<>();
		
		sequence.add("engine");
		sequence.add("start");
		sequence.add("stop");
		
		benzModel.setSequence(sequence);
		benzModel.run(); 
	}	
}




执行结果如下:
BenzModel.engineBoom()
BenzModel.start()
BenzModel.stop()


显然,这样能满足客户的需求,但是如果客户需要N多种模型,势必要在每一处执行
模型的创建和sequence的指定。

试想,有没有改进方法,我们可以尝试将CarModel的创建封装起来,我们增加一个CarBuidler抽象类。具体的类图如下:


代码如下:
public  abstract class CarBuilder {

	public abstract void setSequence(ArrayList<String> sequence);
	
	public abstract CarModel getCarModel();
}


public class BenzBuilder extends CarBuilder{

	private BenzModel benzModel = new BenzModel();
	@Override
	public void setSequence(ArrayList<String> sequence) {		
		this.benzModel.setSequence(sequence);
	}

	@Override
	public CarModel getCarModel() {
		// TODO Auto-generated method stub
		return this.benzModel;
	}

}


public class BmwBuilder extends CarBuilder{

	private BmwModel bmw = new BmwModel();
	
	@Override
	public void setSequence(ArrayList<String> sequence) {
		this.bmw.setSequence(sequence);
	}

	@Override
	public CarModel getCarModel() {
		return this.bmw;
	}
}

测试代码如下:
BenzModel benzModel = new  BenzModel();
		ArrayList<String> sequence =  new ArrayList<>();
		
		sequence.add("engine");
		sequence.add("start");
		sequence.add("stop");
		
		BenzBuilder  benzBuilder = new BenzBuilder();
	    benzBuilder.setSequence(sequence);
	    CarModel benz = benzBuilder.getCarModel();
	    benz.run();
	    
	    //假设bmw也有这种顺序
	    BmwBuilder  bmwBuilder = new BmwBuilder();
	    bmwBuilder.setSequence(sequence);
	    CarModel bmw = bmwBuilder.getCarModel();
	    bmw.run();



看下上述代码,虽然把对象的创建进行了封装,但还是要在每一处都显示指定sequence,
试想能否进行继续封装,把指定sequence这段过程进行封装。
我们加入Director,相当于一个上下文概念,里面包含了 各种Builder来构建
多种模型功能。相关的类图如下:



相关的代码变更如下:
public class Director {

	private ArrayList<String> sequence = new ArrayList<>();
	
	private BenzBuilder benzBuilder = new BenzBuilder();
	
	private BmwBuilder bmwBuilder = new BmwBuilder();
	
	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");
		this.sequence.add("start");
		this.sequence.add("stop");
		this.benzBuilder.setSequence(sequence);
		return (BenzModel)this.benzBuilder.getCarModel();
	
	}
	
	
	
	public BmwModel getCBMWModel()
	{
		this.sequence.clear();
		this.sequence.add("alarm");
		this.sequence.add("start");
		this.sequence.add("stop");
		this.bmwBuilder.setSequence(sequence);
		return (BmwModel)this.bmwBuilder.getCarModel();
	}
	
	public BmwModel getDBMWModel()
	{
		this.sequence.clear();
		this.sequence.add("alarm");
		this.bmwBuilder.setSequence(sequence);
		return (BmwModel)this.bmwBuilder.getCarModel();
	}
	
	
	
}



public class Client {

	public static void main(String[] args) {
	    Director director = new Director();
	    for(int i =0; i<10;i++)
	    {
	    	director.getABenzModel().run();
	    }
	    
	    for(int i =0; i<100;i++)
	    {
	    	director.getBBenzModel().run();
	    }
	    
	    
	    for(int i =0; i<1000;i++)
	    {
	    	director.getCBMWModel().run();
	    }
	    
	    
	    
	}
	
	

}






建造者模式的执行场景:
相同的方法不同的执行顺序产生不同的执行结构。
多个零配件可以装配到一个对象中,但是产生的运行结果又不同时可以使用该模式。
和工厂模式的区别是,工厂模式注重生产产品的过程,构建者模式重在构建过程的顺序不同
  • 大小: 22 KB
  • 大小: 29.5 KB
分享到:
评论

相关推荐

    设计模式——建造者模式

    建造者模式是一种结构型设计模式,它允许我们分步骤创建复杂对象,而无需暴露构建过程的内部细节。这种模式在Java编程中非常常见,尤其是在处理需要多种构建方式或需要隔离对象构造过程的场景。 建造者模式的核心...

    建造者模式c++实现

    建造者模式是一种设计模式,它将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在C++中实现建造者模式,我们可以遵循以下步骤: 首先,我们需要定义一个抽象建造者(Builder)类,它声明了一...

    设计模式之建造者模式代码示例

    建造者模式(Builder Pattern)是软件工程中一种用于创建对象的抽象工厂方法,它将复杂的构建过程分解为一系列步骤,使得构建过程可以独立于其表示进行。这种模式允许客户端使用相同的构建过程创建不同表现形式的...

    设计模式之建造者模式

    建造者模式(Builder Pattern)是设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,通过将构造过程与对象本身分离,使得同样的构造过程可以创建不同的表示。这种模式常用于当创建对象的步骤复杂或者...

    建造者模式.pptx

    ### 建造者模式详解 #### 模式介绍 建造者模式(Builder Pattern)是设计模式中的一种,主要用于创建复杂对象。此模式的核心在于将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。简单...

    Java建造者模式源码

    Java建造者模式是一种设计模式,属于创建型模式,它的主要目的是通过隔离对象的构建过程和其表示,使得构造复杂对象的过程更加灵活。这种模式通常在需要创建对象的多个部分,并且这些部分可能需要以特定顺序组合时...

    设计模式-建造者模式

    建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种方法来分步骤构建复杂的对象,使得构建过程和表示分离,使得同样的构建过程可以创建不同的表示。这种模式经常在对象的构造过程中需要进行多种选择...

    ios 进阶 建造者模式

    建造者模式,也被称为Director模式,是设计模式中的一种创建型模式。在iOS开发中,尤其是在构建复杂对象或者需要进行定制化组装时,建造者模式显得尤为重要。它将产品的构造过程与产品本身分离,使得创建过程更加...

    建造者模式实例

    建造者模式是一种设计模式,属于创建型模式,它允许我们分步骤构建复杂对象,而无需暴露构造过程。这种模式在IT行业中广泛应用于软件系统中,尤其是当需要创建的对象具有多种可变构造选项时。大众CC是一款知名的轿车...

    C#设计模式之建造者模式

    建造者模式是软件设计模式中的一种,主要用于将复杂的对象构建过程与对象的使用分离,使得同样的构建过程可以创建不同的表示。在C#中,我们可以通过类的继承和接口的使用来实现这一模式。以下是关于“C#设计模式之...

    java 建造者模式

    建造者模式(Builder Pattern)是Java设计模式中的创建型模式之一,它允许我们分步骤创建复杂的对象,通过将构造过程与表示分离,使得同样的构造过程可以创建不同的表示。这种模式通常用于那些具有多种构建方式或者...

    设计模式-建造者模式(讲解及其实现代码)

    建造者模式,是一种创建型设计模式,它提供了一种创建对象的最佳方式,特别是在对象的构建过程比较复杂,需要多个步骤时。在建造者模式中,我们创建一个指导对象(Director),该对象负责组织构建过程,而具体的构建...

    java 建造者模式代码

    建造者模式是一种设计模式,它将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在Java中,这种模式通常用于构建对象时,尤其是当对象的构造过程复杂,需要多步骤或者允许用户自定义构建过程时...

    qt5编写的建造者模式程序

    【建造者模式】是软件工程中的一个设计模式,属于创建型模式,它隔离了对象的构造过程,并允许用户以步骤化的方式创建复杂对象。在Qt5框架中,我们可以利用其强大的C++支持来实现建造者模式,这对于创建复杂的UI或者...

    c++ 建造者模式实例

    建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表现。这就是建造者模式。 建造者模式可以把一个产品的内部表象与产品的生成过程分隔开来,从而可以使一个建造过程就可以生成...

    设计模式例子,观察者模式,建造者模式

    在给定的压缩包文件中,"设计模式例子,观察者模式,建造者模式" 提到了两种重要的设计模式:观察者模式(Observer Pattern)和建造者模式(Builder Pattern)。下面我们将深入探讨这两种设计模式的概念、应用场景、...

    建造者模式学习以及与工厂模式的区别

    建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种方法来分步骤构建复杂的对象,使得构建过程和表示分离。这种模式常用于当一个对象的构建过程复杂且需要多个步骤时,或者当我们希望同一个构建过程...

Global site tag (gtag.js) - Google Analytics