`

创建型-生成器模式(Builder)

阅读更多

1、意图

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

 

2、场景描述

  编辑软件的“另存为”功能便是生成器模式的一个体现。例如,Word的另存为功能,可以选择将文件存储为doc、docx、pdf、txt等格式,但是通过word的另存为功能转变文档的存储格式时都采用了“文件 --> 另存为”,相同的创建过程。当需要对word支持新的类型转换时,例如,添加*.newtype类型的转换,此时只需在“另存为”对话框的“选择存储类型”中添加一行"*.newtype"即可,用户无需知晓具体的存储格式的转变过程,用户只需获得“newtype”类型的文档产品即可。

 

3、生成器模式类图

  
  
   角色

  • Builder:为创建一个Product对象的各个部件指定抽象接口;
  • ConcreteBuilder:实现Builder接口以构造和装配该产品的各个部件;定义并明确它所创建的表示;提供一个检索对象的接口(如GetResult方法);
  • Director:构造一个使用Builder接口的对象;
  • Product:表示被构造的复杂对象(ConcreteBuilder创建该产品的内部表示并定义它的装配过程);包含了定义组成部件的类,包括将这些部件装配成最终产品的接口。

4、协作

  • 用户类创建Director对象,并用它想用的Builder对象进行配置;
  • 导向器Director对象控制想要生成的产品部件,并将部件生成指令传递给Builder;
  • Builder生产组成产品的部件,并将部件组装到产品中;
  • 用户类从生成器类中获取产品。

5、适用性

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

6、代码实现

 

  6.1 产品类FormattedFile;

package com.crazysnail.builder;

/**
 * 格式化文件,doc、docx、txt、pdf等类型文件的超类 
 */
public class FormattedFile {
	private String title;
	private String font;
	private String paragraph; 	//文件基本信息
	
	/*getter、setter方法*/
}
 

 6.2 Builder类及其子类;

    FileFormatConverter类; 

/**
 * 
 *文件格式转换父类,提供了对接口的默认实现
 *
 */
public class FileFormatConverter {
	private FormattedFile file;
	public FileFormatConverter(){
		file = new FormattedFile();
	}	
	/*对Word文字进行转换*/
	public void convertCharacter(){
	}
	
	/*对Word字体进行格式转换*/
	public void convertFont(){
	}
	
	/*对Word段落、标题等进行格式转换*/
	public void convertParagraph(){
	}
	
	public FormattedFile getFile(){
		return file;
	}
}
   所有Builder的父类FileFormatConverter类,当需要对某些方法提供默认实现时,定义为类,此时它的子类中可以对省略对某些父类中方法的重载;当Builder的父类定义为接口时,则每个具体的Builder必须提供对每个接口方法的个性化的定义;可根据实际情况在两种实现上选择。

 

  PdfFormatConverter类;  

public class PdfFormatConverter extends FileFormatConverter {
	private FormattedFile file;

	public PdfFormatConverter(){
		file = new FormattedFile();
	}
	@Override
	public void convertCharacter(){
		System.out.println("将file中的字符转化为pdf中对应的表示");
	}
	
	@Override
	public void convertFont(){
		System.out.println("将file中的字体转化为pdf中的默认字体");
	}
	
	@Override
	public void convertParagraph(){
		System.out.println("将file的段落格式转化为pdf中的段落格式");
	}
	
	public FormattedFile getFile(){
		return file;
	}
}
   PdfFormatConverter作为ConcreteBuilder类,提供了将文件转化为pdf格式文件的实现。

  TxtFormatConverter类; 

public class TxtFormatConverter extends FileFormatConverter {
	private FormattedFile file;
	public TxtFormatConverter(){
		file = new FormattedFile();
	}	
	@Override
	public void convertCharacter(){
		System.out.println("将file中的字符转化为txt中的表示");
	}
	
	@Override
	public void convertFont(){
		System.out.println("将file中的字符转化为txt中的表示");
	}
	
	/*对于convertParagraph方法使用父类中的默认实现,即不对段落格式进行转换*/
	
	public FormattedFile getFile(){  //定义该方法时,可以将返回类型定义为FormattedFile的子类型TxtFile
		return file;
	}
}
   TxtFormatConverter类作为ConcreteBuilder,提供了将文件转化为txt格式文件的实现,其中convertParagraph方法直接使用了父类中的默认定义。

  6.3 Director类;

 

public class UseFormatConverter {
	public FormattedFile convertFile(FileFormatConverter converter){
		//产品的构件过程是由Director类来调用的
		converter.convertCharacter();
		converter.convertFont();
		converter.convertParagraph();
		
		FormattedFile file = converter.getFile();
                return file;
	}
}
   Director类调用Builder中的相关接口来构建产品,并且获取产品。

  6.4类关系说明;

  作为Builder的FileFormatConverter类,提供了对外使用ConcreteBuilder的接口,用户类通过这些接口对产品进行处理,并且Builder提供给用户类获取产品的方法getFile。

7、总结;
 7.1生成器模式的特点;
  • 它使你可以改变一个产品的内部表示——Director类调用Builder类提供的抽象接口来构造产品,Builder类隐藏了整个产品的表示和内部结构;当你需要添加产品的一种新的内部结构和表示时,只需定义一个新的ConcreteBuilder类即可。例如场景描述中需要添加对”newType“类型的支持时,只需添加一个FileFormatConverter的子类NewTypeFormatConverter。
  • 它将构造代码和表示代码分开——整个产品的构造过程是通过Director来控制的,但是产品如何构造是完全在Builder的子类中进行实现的,二者是分离开来的。Builder的具体实现可在不同的Director中共享。
  • 它使你对构造过程进行更精细的控制——产品的构造过程是在Director中一步一步构造的,并不是一下生成的。当构建完成时,Director类从Builder类中获取产品。
 
分享到:
评论

相关推荐

    生成器模式builder

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

    【设计模式】- 生成器模式(Builder)(csdn)————程序.pdf

    生成器模式,也称为建造者模式,是一种设计模式,用于创建复杂对象,它允许你按照一系列步骤来构造对象,而这些步骤可以通过不同的实现来产生不同形式的对象。生成器模式的核心在于分离了对象的构造过程和表示细节,...

    C#面向对象设计模式4:生成器(Builder)

    生成器模式是一种创建型设计模式,它允许我们分步骤构建复杂对象,同时隐藏了对象组装的细节。这种模式的核心思想是将产品的构造过程与产品本身分离,使构造过程可以有不同的表示方式。生成器模式通常由四个主要角色...

    C#面向对象设计模式纵横谈\4 创建型模式Builder生成器模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第4节:创建型模式Builder生成器模式

    C#面向对象设计模式纵横谈(4):Builder 生成器模式(创建型模式)

    Builder模式是一种创建型设计模式,它提供了一种创建对象的抽象接口,并允许使用不同的实现来控制对象的构造过程。在C#中,Builder模式经常被用于复杂对象的构建,特别是当构建过程需要多个步骤或者需要在不同环境中...

    C#视频-面向对象设计模式纵横谈(4):Builder 生成器模式(创建型模式)

    Builder模式是一种创建型设计模式,它提供了一种...在观看“C#视频-面向对象设计模式纵横谈(4):Builder 生成器模式(创建型模式)”的视频教程时,可以深入理解Builder模式的工作原理,学习如何在实际项目中有效应用。

    生成器模式代码示例

    生成器模式是一种设计模式,属于创建型模式,它允许我们分步骤构建复杂对象,而无需提前知道整个对象的完整结构。这种模式的核心在于延迟初始化,它使得我们可以根据需要逐步构建对象,而不是一次性创建所有部分。在...

    23钟设计模式之生成器模式

    生成器模式(Builder Pattern)是一种创造型设计模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建可以创建不同的表示。这种模式可以在以下情况下使用: 1. 当创建复杂对象的算法应该独立于该对象的组成...

    java生成器模式

    生成器模式(Builder Pattern)是Java设计模式中的创建型模式之一,主要解决复杂对象的构建问题,通过将构造过程逐步分解,使得构造过程与表示分离,使得同样的构建过程可以创建不同的表示。这种模式通常用于创建...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    创建型模式 (100%) 设计模式面面观(5):抽象工厂模式(AbstractFactory)-创建型模式 (100%) 设计模式面面观(6):生成器模式(Builder)-创建型模式 (100%) 设计模式面面观(7):原型模式(Prototype...

    C#面向对象设计模式纵横谈(4):Builder 生成器模式(创建型模式) (Level 300)

    Builder模式是一种创建型设计模式,它提供了一种创建对象的抽象接口,并允许使用不同的实现来创建复杂的对象。在C#中,Builder模式可以帮助我们在不暴露复杂构造过程的情况下,创建具有多种构建步骤的对象。这种模式...

    生成器模式源代码

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

    生成器模式

    生成器模式是一种设计模式,属于创建型模式,它在软件工程中被广泛应用于解决大量对象的创建问题。这种模式的主要思想是将对象的创建过程分解为一系列步骤,使得客户端可以根据需要选择执行这些步骤,从而实现延迟...

    生成器模式例子

    在《Head First Design Patterns》文中是这么介绍生成器模式的,“封装一个产品的构造过程,并允许按步骤构造”,感觉说得不是很清楚。而在网上查找相关资料是这么解释的,建造者模式(Builder Pattern)使用多个简单...

    Builder(生成器)模式参照.pdf

    Builder 模式(生成器模式) Builder 模式是一种创建型设计模式,它将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。GoF 将其定义为将一个复杂对象的构建与它的表示分离,使得同样的...

    Builder(生成器)模式借鉴.pdf

    Builder 模式(生成器模式) Builder 模式是一种创建型设计模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Builder 模式与 Abstract Factory 模式非常像,但是它们之间有着...

    iOS 生成器模式

    生成器模式是设计模式中的一种,它属于创建型模式,主要用来处理复杂对象的构建过程。在这个“iOS生成器模式”中,我们将深入探讨如何在iOS开发中应用这个模式。 生成器模式的核心思想是将对象的创建过程和对象本身...

    CodeBuilder-v2.0.0.4 代码生成器

    CodeBuilder-v2.0.0.4是一款专业的代码生成器工具,它旨在帮助开发者提高工作效率,减少手动编写重复性代码的工作量。代码生成器在软件开发过程中扮演着至关重要的角色,尤其是在大型项目中,它可以自动根据数据库...

    设计模式

    生成器模式是一种创建型设计模式,它提供了一种方法来分离开对象的构建过程和其表示方式,允许使用相同的构造过程生成不同类型的对象。在实际应用中,生成器模式常用于复杂对象的构建,尤其是在需要根据不同的条件或...

Global site tag (gtag.js) - Google Analytics