深入浅出设计模式 ------ Builder(生成器模式)

一. 定义  将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。

二. 结构 

三. 参与者

Builder : 为创建一个Product对象的各个部件指定抽象接口。

ConcreteBuilder : 实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口。

Director : 构造一个使用(聚合:has-a的关系)Builder接口的对象。如下文代码ChefDirector类。

Product : 表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类, 包括将这些部件装配成最终产品的接口。

四. 时序图

从图中可以看出来Builder模式一个特点就是将内容集中生成, 然后输出。 常见例子就是StringBuilder的append方法, 一直append, 然后最终生成一个String。

五. 代码实现:

厨师作为水果沙拉的制作指挥者, 下令做沙拉, 具体细节不管。

package com.wenniuwuren.builder;
/**
 * 厨师指挥者类
 * @author wenniuwuren
 *
 */
public class ChefDirector {  

    private FruitSaladBuilder fruitSaladBuilder;  

    // 持有当前所需要的构建器对象
    public  ChefDirector (FruitSaladBuilder fruitSaladBuilder) {
    	this.fruitSaladBuilder = fruitSaladBuilder;
    }  

    // 制造水果沙拉
    public void constructFruitSalad() {
    	fruitSaladBuilder.buildSalad();
    	fruitSaladBuilder.buildApple();
    	fruitSaladBuilder.buildWaterMelon();
    }
}  

水果沙拉制作接口:规定制作沙拉方法, 具体实现交给实现类ConcreteFruitSaladBuilder

package com.wenniuwuren.builder;
/**
 * 制作水果沙拉接口
 * @author wenniuwuren
 *
 */
public interface FruitSaladBuilder {  

    // 添入沙拉酱
    public void buildSalad();
    // 添入西瓜
    public void buildWaterMelon();
    // 加入苹果
    public void buildApple(); 

    // 便于Client得到最后的Result
    public FruitSaladProduct getFruitSaladProduct();   

}  

水果沙拉具体制作:

package com.wenniuwuren.builder;
/**
 * 实际制作沙拉
 * @author wenniuwuren
 *
 */
public class ConcreteFruitSaladBuilder implements FruitSaladBuilder {

	FruitSaladProduct fruitSaladProduct = new FruitSaladProduct();

	// 添入沙拉酱
	public void buildSalad() {
		fruitSaladProduct.setSalad("沙拉酱");
	}
	// 添入西瓜
	public void buildWaterMelon() {
		fruitSaladProduct.setWatermelon("西瓜");
	}
	// 加入苹果
	public void buildApple() {
		fruitSaladProduct.setApple("苹果");
	}  

	// 便于Client得到最后的Result
	@Override
	public FruitSaladProduct getFruitSaladProduct() {
		return fruitSaladProduct;
	}

}  

水果沙拉产品: 保存着制作水果沙拉的水果种类

package com.wenniuwuren.builder;
/**
 * FruitSalad产品
 * @author wenniuwuren
 *
 */
public class FruitSaladProduct {  

    private String apple;
    private String watermelon;
    private String salad;

	public String getApple() {
		return apple;
	}
	public void setApple(String apple) {
		this.apple = apple;
	}
	public String getWatermelon() {
		return watermelon;
	}
	public void setWatermelon(String watermelon) {
		this.watermelon = watermelon;
	}
	public String getSalad() {
		return salad;
	}
	public void setSalad(String salad) {
		this.salad = salad;
	}
}  

测试类:

package com.wenniuwuren.builder;
/**
 * 测试类
 * @author wenniuwuren
 *
 */
public class Client {

	public static void main(String[] args) {

		FruitSaladBuilder appleSaladBuilder = new ConcreteFruitSaladBuilder();
		// Builder当成参数传入接受指挥
		ChefDirector chefDirector = new ChefDirector(appleSaladBuilder);

		// 内部连续添加材料
		chefDirector.constructFruitSalad();

		// 一次性输出
		FruitSaladProduct fruitSaladProduct = appleSaladBuilder
				.getFruitSaladProduct();
		System.out.println("沙拉的配料是:" + fruitSaladProduct.getSalad() + ", "
				+ fruitSaladProduct.getWatermelon() + ", "
				+ fruitSaladProduct.getApple());
	}
}

输出结果:

沙拉的配料是:沙拉酱, 西瓜, 苹果

六. 总结

正如上述代码实现, Builder设计模式将具体的实现隐藏在Builder中, 指挥者Director无需关心细节。 这个和Abstract Factory很相似, 但是区别在于Builder在于一步步构造对象,
最后一次性输出, 而Abstract Factory注重于多个系列的产品的生产, 并且它是立即返回结果的。

参考书籍

《设计模式:可复用面向对象软件的基础》

时间: 2024-10-25 18:41:40

深入浅出设计模式 ------ Builder(生成器模式)的相关文章

深入浅出设计模式 ------ Builder(生成器)

一. 定义  将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 二. 结构  三. 参与者 Builder : 为创建一个Product对象的各个部件指定抽象接口. ConcreteBuilder : 实现Builder的接口以构造和装配该产品的各个部件.定义并明确它所创建的表示.提供一个检索产品的接口. Director : 构造一个使用(聚合:has-a的关系)Builder接口的对象.如下文代码ChefDirector类. Product : 表示被构造的复杂对

每天一个设计模式-7 生成器模式(Builder)

每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式. 导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾. 二.问题分析 无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同.即他们的构造算法固定,只是生成的结果不同:能不能把算法(构建)和结果(外观)分离出

设计模式(二): BUILDER生成器模式 -- 创建型模式

1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 2. 当构造过程必须允许被构造的对象有不同表示时. 3.评价 1. 它使你可以改变一个产品的内部表示. Builder对象提供给导向器一个构造产品的抽象接口.该接口使得生成器可以隐藏这个产品的表示和内部结构.它同时也隐藏了该产品是如何装配的.因为产品是通过抽象接口构造的,你在改变该产品的内部表

设计模式03: Builder 生成器模式(创建型模式)

Builder生成器模式(创建型模式) Builder模式缘起假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分富于变化.如果使用最直观的设计方法,每个房屋部分的变化,都将导致房屋构建的重新修正... 动机(Motivation)在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却非常稳定.如何应对这种变化?如何提供一种“封装机制”来隔离

深入浅出设计模式 ------ Prototype(原型模式)之深度克隆

继上篇深入浅出设计模式 ------ Prototype(原型模式)的浅克隆实现, 本文进入Prototype(原型模式)的进阶篇----深度克隆. 深度克隆 ---- 序列化方式实现 把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization).写在流里的是对象的一个克隆(新的, 独立的), 而原对象仍存在于JVM内存模型里.因此, 以下代码采用序列化方式实现深度克隆. 第一步: 将上篇的代码做些许改动, 加入对象引用

设计模式开始--生成器模式

生成器模式 设计模式的原则:尽量暴漏在主程序里面的代码扩展性强一些,多用接口和虚拟类,少用实现类,这样再改程序的时候就方便的多了. 1.作用:一个Product类的产生需要多个其他的类Unit顺序生成之后组合而成,而且这些Unit的产生方法是不固定的. 举例而言一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用.比如,一个电子邮件有发件人地址.收件人地址.主题.内容.附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出.有些情况下,一个对象的一些性

Java设计模式:生成器模式

问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); 之所以容易创建,因为其类成员都是基本数据类型或者封装类,或者字符串.但是如果对象的类成员还是对象,那么创建这个对象还需要产生该对象成员的具体对象. public class Unit1 { } public class QuestionProduct {     Unit1 u1;     Unit2 u2;

设计模式(2): 生成器模式

生成器模式(英:Builder Pattern)是一种设计模式,又名:建造模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 前面一篇文章提到的抽象工厂模式与生成器相似,因为它也可以创建复杂对象.主要的区别是生成器模式着重于一步步构造一个复杂对象.而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的).生成器在最后的一步返回产品,而对于抽象工厂来说,产品是立即返回的. 意图:将一个复杂的构建与其表示相分离,

一天一个设计模式——Builder建造者模式

一.模式说明 在现实世界中,当我们要构造一个大型工程时(建一个大楼),通常的做法是先建造工程的每个独立部分,然后再逐步构造完成(先打地基,再搭框架,最后逐层累造).在程序设计领域,构造一个复杂的类时(或一些具有类似结构的复杂类时),也可以采用类似的思想:如果要创建一个用于构造文档的类(或者是word,或者是html),虽然具体的文档有不同的结构,但是构造这些对象有相同的套路:创建标题,创建内容,创建条目,结束文档.Builder建造者模式就是用来构造复杂的类的. 二.模式类图 三.模式时序图 四