设计模式(三) 生成器(Builder)

1.定义

生成器是一种对象创建型的模式。生成器将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。

2.适用性

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时
  • 当构造过程必须允许被构造的对象又不同的表示时

3.结构

Builder: 为创建一个Product对象的各个部件指定抽象接口。(工厂方法是为整个对象)

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

Director: 构造一个使用Builder接口的对象。

Product: 表示被构造的复杂对象,ConcreteBuilder创建该产品的内部表示并定义它的装配过程。

4.举例说明

如图所示,Order类为导向器(Director),用来产生一个Builder的对象。MealBuilder就是抽象Builder,它的两个子类是AmericanMealBuilder和ChineseMealBuilder是具体Builder用于一步一步地构造meal的各个部分。Meal类是Product。TestMeal是测试类。

下面上源码:

Order.java:

package com.andy.designpattern.builder;

public class Order {
	private MealBuilder mealBuilder;
	public void makeOrder(MealBuilder mb){
		mealBuilder = mb;
	}
	public void createMeal(){
		mealBuilder.createMeal();
		mealBuilder.buildMainFood();
		mealBuilder.buildDrink();
		mealBuilder.buildDish();
		mealBuilder.buildSauce();
	}
	public Meal getMeal(){
		return mealBuilder.getMeal();
	}

}

MealBuilder.java:

package com.andy.designpattern.builder;

public abstract class MealBuilder {
	protected Meal meal; // let child class see it
	public Meal getMeal(){
		return this.meal;
	}
	public void createMeal(){
		meal = new Meal();
	}
	 public abstract void buildMainFood();
	 public abstract void buildDrink();
	 public abstract void buildDish();
	 public abstract void buildSauce();
}

AmericanMealBuilder.java:

package com.andy.designpattern.builder;

public class AmericanMealBuilder extends MealBuilder {

	public void buildMainFood() {
		// TODO Auto-generated method stub
		this.meal.setMainFood("fries");
	}

	public void buildDrink() {
		// TODO Auto-generated method stub
		this.meal.setDrink("coke");
	}

	public void buildDish() {
		// TODO Auto-generated method stub
		this.meal.setDish("hamburger");
	}

	public void buildSauce() {
		// TODO Auto-generated method stub
		this.meal.setSause("ketchup");
	}

}

ChineseMealBuilder.java:

package com.andy.designpattern.builder;

public class ChineseMealBuilder extends MealBuilder {

	public void buildMainFood() {
		// TODO Auto-generated method stub
		this.meal.setMainFood("rice,noodles");
	}

	public void buildDrink() {
		// TODO Auto-generated method stub
		this.meal.setDrink("soup");
	}

	public void buildDish() {
		// TODO Auto-generated method stub
		this.meal.setDish("vegetables and meat");
	}

	public void buildSauce() {
		// TODO Auto-generated method stub
		this.meal.setSause("peanut sause");
	}

}

Meal

package com.andy.designpattern.builder;

public class Meal {
	private String mainFood;
	private String drink;
	private String dish;
	private String sause;
	public String getMainFood() {
		return mainFood;
	}
	public void setMainFood(String mainFood) {
		this.mainFood = mainFood;
	}
	public String getDrink() {
		return drink;
	}
	public void setDrink(String drink) {
		this.drink = drink;
	}
	public String getDish() {
		return dish;
	}
	public void setDish(String dish) {
		this.dish = dish;
	}
	public String getSause() {
		return sause;
	}
	public void setSause(String sause) {
		this.sause = sause;
	}
	public String toString(){
		return "MainFood:"+mainFood+"\nDrink:"+drink+"\nDish:"+dish+"\nSause:"+sause+"\n";
	}

}

TestMeal.java:

package com.andy.designpattern.builder;

public class TestMeal {
	public static void main(String[] args) {
		MealBuilder chineseBuilder = new ChineseMealBuilder();
		MealBuilder americanBuilder = new AmericanMealBuilder();
		Order order = new Order();
		order.makeOrder(chineseBuilder);
		order.createMeal();
		Meal meal1 = order.getMeal();
		order.makeOrder(americanBuilder);
		order.createMeal();
		Meal meal2 = order.getMeal();
		System.out.println("Chinese :\n"+meal1.toString());
		System.out.println("American :\n"+meal2.toString());
	}
}

控制台输出为:

Chinese :
MainFood:rice,noodles
Drink:soup
Dish:vegetables and meat
Sause:peanut sause

American :
MainFood:fries
Drink:coke
Dish:hamburger
Sause:ketchup

从例子中我们可以看到,我们仅仅是给导向器(Order类)传入了不同类型的MealBuilder引用,就从生成器当中得到了不同的产品。生成器模式很好地隐藏了产品实现的细节,将构造和表示分开。生成器模式常常是在Director中将产品分成许多部分,然后再Builder的中一部分一部分的构建出产品,最后再从Builder中将产品取出。

5.相关模式

抽象工厂模式与生成器模式相似,都可以用于创建复杂的对象。主要区别是生成器模式是一步步地构造对象,产品在最后一步才返回,而抽象工厂是生产一系列(常常是多个)产品,并且立即返回产品。

参考资料:

1.维基百科:生成器模式

2.Tutorialspoint: Builder Pattern

3.Build Design Pattern

时间: 2024-08-03 17:10:30

设计模式(三) 生成器(Builder)的相关文章

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

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

iOS设计模式之生成器

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

Php设计模式(三):行为型模式part1

原文详见:http://www.ucai.cn/blogdetail/7023?mid=1&f=5 可以在线运行查看效果哦! 在上一篇我们讲了结构型模式,结构型模式是讨论类和对象的结构的.总共有7种.而今天我们来介绍一下行为型模式. 一.什么是行为型模式? 行为型模式: 就是描述类和对象之间的通信和职责的.简而言之,就是类和对象扮演什么角色,还有怎么扮演这个角色的问题. 二.行为型模式的种类 大体上分为三个大类:常见模式.已知模式.深度模式 常见模式包括: 模版方法模式.命令模式.迭代器模式.观

Php设计模式(三):行为型模式part2

原文详见:http://www.ucai.cn/blogdetail/7023?mid=1&f=5 可以在线运行查看效果哦! <接上文> 5.中介者模式(Mediator) : 用中介对象封装一系列的对象交互,中介使各对象不需要显式地相互引用.类似于邮局,邮寄者和收件者不用自己跑很远路,通过邮局就可以. 好处:简化了对象之间的关系,减少子类的生成. 弊端:中介对象可能变得非常复杂,系统难以维护. 应用场景:不需要显示地建立交互. 代码实现: ? 1 2 3 4 5 6 7 8 9 10

设计模式三—抽象工厂模式

设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是园丁2的杰作 1.Fruit.java public interface Fruit { /* * 生长 * 收获 * 栽种 */ public void grow(); public void harvest(); public void plant(); } 2.Apple.java publi

C#中的异步调用及异步设计模式(三)——基于事件的异步模式

四.基于事件的异步模式(设计层面) 基于事件的C#异步编程模式是比IAsyncResult模式更高级的一种异步编程模式,也被用在更多的场合.该异步模式具有以下优点: ·                  “在后台”执行耗时任务(例如下载和数据库操作),但不会中断您的应用程序. ·                  同时执行多个操作,每个操作完成时都会接到通知(在通知中可以区分是完成了哪个操作). ·                  等待资源变得可用,但不会停止(“挂起”)您的应用程序. ·  

设计模式三: 代理模式(Proxy) -- JDK的实现方式

设计模式三: 代理模式(Proxy) -- JDK的实现方式 简介 代理模式属于行为型模式的一种, 控制对其他对象的访问, 起到中介作用. 代理模式核心角色: 真实角色,代理角色; 按实现方式不同分为静态代理和动态代理两种; 意图 控制对其它对象的访问. 类图 实现 JDK自带了Proxy的实现, 下面我们先使用JDK的API来演示代理如何使用, 随后再探究Proxy的实现原理,并自己来实现Proxy. JDK代理类的使用: (InvocationHandler,Proxy) 使用JDK实现的代

Objective-C设计模式——生成器Builder(对象创建)

生成器 生成器,也成为建造者模式,同样是创建对象时的设计模式.该模式下有一个Director(指挥者),客户端知道该类引用用来创建产品.还有一个Builder(建造者),建造者知道具体创建对象的细节. 指挥者只是起到协调的作用,它有一个Builder引用用于指挥Builder如何创建对象,Builder内就是为了构建对象的算法. 其实生成器模式,就是为了定制某些特定对象而产生的模式.对象的过长往往非常的复杂,如果不是用该模式来创建对象,对象创建类将会非常的冗余且难以复用.使用生成器将表现层和创建

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

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