`
TRAMP_ZZY
  • 浏览: 137845 次
社区版块
存档分类
最新评论

设计模式-建造者模式(生成器模式)

阅读更多

ArrayList 或者 HashMap 如果定义为类的成员变量,那么在方法中调用一定要做一个clear()动作,以防止
数据混乱。

Separate the construction of a complex object from its representation so that the same constrction
process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。




	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 enginBoom();
		
		final public void run() {
			for (int i=0; i<this.sequence.size(); i++) {
				String actionName = this.sequence.get(i);
				if (actionName.equals("start")) {
					this.start();
				} else if (actionName.equals("stop")) {
					this.stop();
				} else if (actionName.equals("alarm")) {
					this.alarm();
				} else if (actionName.equals("engin boom")) {
					this.enginBoom();
				}
			}
		}

		final public void setSequence(ArrayList<String> sequence) {
			this.sequence = sequence;
		}
		
	}
	
	public class BenzModel extends CarModel {

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

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

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

		@Override
		protected void enginBoom() {
			System.out.println("benz enginBoom");
		}

	}
	
	public class BMWModel extends CarModel {

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

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

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

		@Override
		protected void enginBoom() {
			System.out.println("BMW enginBoom.");
		}

	}
	
	public abstract class CarBuilder {

		public abstract void setSequence(ArrayList<String> sequence);
		
		public abstract CarModel getCarModel();
		
	}
	
	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 bmw;
		}

	}
	
	public class BenzBuilder extends CarBuilder {

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

		@Override
		public CarModel getCarModel() {
			return bezn;
		}

	}

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(this.sequence);
		
		return (BenzModel) this.benzBuilder.getCarModel();
	}
	
	public BenzModel getBBenzModel() {
		this.sequence.clear();
		this.sequence.add("engineboom");
		this.sequence.add("start");
		this.sequence.add("stop");
		this.benzBuilder.setSequence(this.sequence);
		
		return (BenzModel) this.benzBuilder.getCarModel();
	}
	
	public BMWModel getABMWModel() {
		this.sequence.clear();
		this.sequence.add("start");
		this.sequence.add("stop");
		this.benzBuilder.setSequence(this.sequence);
		
		return (BMWModel) this.bmwBuilder.getCarModel();
	}
	
	public BMWModel getBBMWModel() {
		this.sequence.clear();
		this.sequence.add("engineboom");
		this.sequence.add("start");
		this.sequence.add("stop");
		this.benzBuilder.setSequence(this.sequence);
		
		return (BMWModel) this.bmwBuilder.getCarModel();
	}
}

public class Client {
	
	public static void main(String[] args) {
		Director director = new Director();
		
		for (int i=0; i<100; i++) {
			director.getABenzModel().run();
		}
		
		for (int i=0; i<100; i++) {
			director.getABMWModel().run();
		}
	}
	
}

建造者模式的优点
(1)封装性 使用建造者模式可以是客户端不必知道产品内部组成的细节。
(2)建造者独立、易扩展。
(3)便于控制细节风险。

建造者模式的使用场景
(1)相同的方法,不同的执行顺序,产生不同的时间结果时,可以采用建造者模式
(2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
(3)在对象的创建过程中会使用一系列的其他对象,这些对象在产品对象的创建过程中不易得到,也可以采用
建造者模式封装该对象的创建过程。该种场景只能是一个补偿方法,因为一个对象不容易获取,而在设计
阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反了设计的最初目标。

建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂模式最大不同的地方,虽然同为创建类模式,
但是注重点不同。





  • 大小: 45.1 KB
  • 大小: 15.7 KB
分享到:
评论

相关推荐

    Java设计模式-建造者模式详解

    Java设计模式-建造者模式详解 Java设计模式-建造者模式详解将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式(Builder)是使用多个“小型”工厂来最终创建出一个完整对象。...

    设计模式 - 建造模式(C++实例)

    建造模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式常用于当构造过程需要步骤化,并且每个步骤可能有多种实现时,比如在软件工程...

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    建造者模式 单例模式 结构型模式 队列模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 行为模式(类行为模式) 解释器模式 模板方法模式 行为模式(对象行为模式) 策略模式 观察者模式 状态模式 导入...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    - **缺点**:产品内部组成变化复杂时,会增加很多具体建造者类。 - **1.5 Prototype模式**:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 - **应用场景**:对象初始化消耗资源过多时。 - ...

    2020版23种Java设计模式-图解-附代码.pdf

    - **建造者模式**:将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - **单例模式**:保证一个类仅有一个实例,并提供一个全局访问点,常用于配置中心、日志对象等场景。 - **原型模式*...

    设计模式--Java语言版本

    3. **建造者模式**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。Java中的Builder模式用于创建复杂的对象结构。 4. **原型模式**:通过复制已有对象来创建新对象,减少了创建新对象...

    总结23种设计模式-极客学院-课件及源码

    4. **建造者模式**:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。适用于构建复杂的、有多个部件的对象。 5. **原型模式**:通过复制已有对象来创建新对象,避免了创建新实例的开销。适用...

    设计模式精解-GoF 23种设计模式

    4. **建造者模式**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。它适用于当创建对象的过程很复杂,需要进行多个步骤时。 5. **原型模式**:通过复制已有对象来创建新对象,而不是...

    设计模式-实例代码

    在标签中提到了“源码”和“工具”,这暗示了我们将关注的是与实际代码相关的实现细节,以及可能的辅助工具,如IDE插件或代码生成器,这些工具可以帮助开发者更好地理解和应用设计模式。 在压缩包文件“template”...

    生成器模式源代码

    生成器模式,也被称为构建器模式,是一种软件设计模式,主要用在对象的创建过程中,它将复杂的构建过程分解为一系列简单的步骤,使得构建过程可配置,并且可以独立于对象的表示进行。在C#中,生成器模式的实现通常...

    设计模式-感觉不错的文档

    4. Builder模式,建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 5. Prototype模式,原型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 ...

    生成器模式builder

    生成器模式(Builder Pattern)是一种设计模式,它允许我们分步骤构建复杂对象,而无需暴露其构造过程。这种模式在创建对象时提供了更大的灵活性,特别是当构造过程需要多个步骤或者对象有不同的构造方式时。Builder...

    设计模式--pdf文档

    设计模式是软件工程中的一种重要概念,它是在特定情境下,为解决常见问题而形成的一套最佳实践。这些模式经过时间的验证,被广泛应用于面向对象编程中,以提高代码的可读性、可维护性和复用性。本PDF文档详细介绍了...

    23种设计模式-软件设计必备_c++.pdf

    - 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - 原型模式(Prototype):用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 结构型...

    建造者(生成器)模式C++、Java实现

    建造者(生成器)模式是一种行为设计模式,它允许我们分步骤构建复杂对象,而无需暴露构造过程。这种模式在创建具有多种配置选项的对象时特别有用,因为它将对象的构造与表示分离,使得构建和表示的过程可以独立进行...

    设计模式-创建型模式、结构型模式和行为型模式

    4. **建造者模式**: - **简介**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 - **应用场景**:当对象的创建步骤较为复杂,或者需要创建多个类似但又略有差异的对象时。 - **...

    一故事一设计模式-LieBrother(完整版).pdf

    根据所提供的文件信息,内容涵盖了设计模式的多个方面,主要分为六大原则、创建型模式、行为型模式和结构型模式四大块。下面,我将根据这些信息,详细阐述这些知识点。 **一、六大设计原则** 1. **单一职责原则...

    java设计模式-part1

    此外,设计模式还有许多其他类型,如建造者模式、适配器模式、装饰器模式等。建造者模式允许分步骤创建复杂对象,避免暴露复杂的构造过程。适配器模式则允许不同接口的类协同工作,通过适配器类转换接口。装饰器模式...

Global site tag (gtag.js) - Google Analytics