创建型-生成器模式(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。
- 它使你可以改变一个产品的内部表示——Director类调用Builder类提供的抽象接口来构造产品,Builder类隐藏了整个产品的表示和内部结构;当你需要添加产品的一种新的内部结构和表示时,只需定义一个新的ConcreteBuilder类即可。例如场景描述中需要添加对”newType“类型的支持时,只需添加一个FileFormatConverter的子类NewTypeFormatConverter。
- 它将构造代码和表示代码分开——整个产品的构造过程是通过Director来控制的,但是产品如何构造是完全在Builder的子类中进行实现的,二者是分离开来的。Builder的具体实现可在不同的Director中共享。
- 它使你对构造过程进行更精细的控制——产品的构造过程是在Director中一步一步构造的,并不是一下生成的。当构建完成时,Director类从Builder类中获取产品。
创建型-生成器模式(Builder)的更多相关文章
- 第9月第6天 push pop动画 生成器模式(BUILDER)
1. https://github.com/MichaelHuyp/QQNews 2.生成器模式(BUILDER) class MazeBuilder { public: virtual void B ...
- 跟着实例学习设计模式(6)-生成器模式builder(创建型)
生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...
- 设计模式十: 生成器模式(Builder Pattern)
简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...
- C#设计模式——生成器模式(Builder Pattern)
一.概述在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装 ...
- 生成器模式Builder
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11406502.html 1. 定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的 ...
- 【设计模式】- 生成器模式(Builder)
生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...
- JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)
简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...
- 生成器模式(Builder)C++实现
意图:将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性:1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 2.当构建过程必须允许被构建的对象有 ...
- 1.6建造者模式(生成器模式) Builder
1.概念:将一个复杂对象的构建和他的表示分离,使得同样的构件可以创建不同的表示. 2.实例:肯德基和中餐,肯德基抽象了整个做菜的复杂过程(相同的构建),然后在不同的店铺进行实现(不同的表示).中餐往往 ...
随机推荐
- 求关注 wcf bindipendpointdelegate 端口限制的功能
我最近也需要实现一个功能:1)一个客户端(192.168.0.15),10个服务端(提供A接口.B接口)如下: 192.168.0.1-5685 192.168.0.2-5685 ...
- 百度地图SDK下载以及创建应用(申请Key)和本地导入Demo
一.百度地图SDK下载 http://lbsyun.baidu.com/sdk/download?selected=location 选择全部,然后分别下载开发包.示例代码.类参考. 二.创建应用(申 ...
- update目标在查询返回结果集中的解决方案
示例: students为学生信息表 Score为成绩表 两个表通过学生号关联 要求:将总成绩小于100的学生名称改为‘天才’ sql如下: error提示:update目标不能在查询返回结果集中 ...
- [记录] js判断数组key是否存在
数组中判断key是否存在 可以通过arrayObject.hasOwnProperty(key)来进行判断数组key是否存在,返回的是boolean值,如果存在就返回true,不存在就返回false ...
- .NET技能分析
知乎话题:如何面试.NET/ASP.NET工程师? No.1初级:1.对 C#(推荐) 或 VB 语言直至与 .NET 4 (目前为止)相匹配的版本,绝大多数特性熟悉并使用过2.通晓 HTTP 协议的 ...
- MidPayinfoVO
package nc.vo.arap.payablebill; import nc.vo.pub.SuperVO; import nc.vo.pub.lang.UFDate; import nc.vo ...
- 阻止子View获取焦点方法
android:descendantFocusability:ViewGroup ep: android:descendantFocusability=blocksDescendants
- PHP使用缓存生成静态页面
http://www.cnblogs.com/lh460795/archive/2013/04/06/3003105.html 在apache / bin/ab.exe 可以做压力测试,该工具可以模 ...
- .Net规则引擎Biztalk,Workflow和CKRule的比较
微软的规则引擎 很多朋友会问,.Net平台有没有规则引擎?像Java就有很多的规则引擎,Drools,ILog都做得非常好,但.Net好像还没有哦.很多知道规则引擎,但不知道.Net的朋友都烦这个 ...
- OpenJudge/Poj 1226 Substrings
1.链接地址: http://bailian.openjudge.cn/practice/1226/ http://poj.org/problem?id=1226 2.题目: 总时间限制: 1000m ...