深入浅出设计模式 ------ 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-11-05 19:34:09

深入浅出设计模式 ------ 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)在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却非常稳定.如何应对这种变化?如何提供一种“封装机制”来隔离

iOS设计模式之生成器

iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得相同的构建过程能够创建不同的表示 (2): 生成器模式除了客户之外还包括一个Director(指导者),和一个builder(生成器).client通过向指导者(Director)提出需求,指导者(Director)向bulider(生成器)提供信息来建造特定的产品.bulider依据特定的信息生产产品并返回给客户. 2:使用生成器的优点 构建某些对象有多种不同的方式,假设这些逻辑包括在构建这些对象

深入浅出设计模式(四)

设计模式已经学了很长时间了,最近又看了一遍,感觉很不一样.当初很难理解或不理解的,现在一看,恍然大悟:哦!原来是这么回事啊~~~ 先说一下对几种关系的理解,包括:依赖.关联.聚合.组合.继承.实现,耦合依次增高. 1.依赖 用虚箭头表示,对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系.在java中,类A使用了类B,其中类B是作为类A的方法参数.方法中的局部变量.或者静态方法调用,这几种情况是依赖.下图中People类依赖于

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

一. 定义  提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们的具体类. 二. 结构 三. 参与者 Product (Fruit和Leaf两个抽象产物) : 抽象生产者接口: TreeFruit(树上的水果). TreeLeaf(树上的叶子). GroundFruit(地上的水果). GroundLeaf(地上的叶子) : 实际的自然产物: NatureFactory: 抽象的自然制造工厂, 用于生产水果和叶子: TreeFactory. LeafFactory : 实际的自然制造工

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

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

深入浅出设计模式 PDF下载高清完整扫描原版

这是我看过最幽默最搞笑最亲切同时又让我收获巨大的技术书籍!森森的膜拜Freeman(s)!Amen!深入浅出,娓娓道来,有的地方能笑死你!不知是翻译还是原著的问题,有几个小地方有点小错误,个人观点,值得商榷.但是瑕不掩瑜啦! 需要学习的朋友可以通过网盘免费下载pdf版 (先点击普通下载-----再选择普通用户就能免费下载了)http://putpan.com/fs/7yib3enschu081088/ 内容简介  · · · · · · <深入浅出设计模式>(影印版)的编写运用许多最新的研究,