创建者模式-Builder
创建者模式使用多个简单的对象一步一步构建成一个复杂的对象。它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象,该 Builder 类是独立于其他对象的。
一、类图

创建者模式包括以下几种角色:
- Builder:为创建一个Product对象的各个部件指定抽象接口。
- ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个获取产品的接口。
- Director:构造一个使用Builder接口的对象。
- Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程 。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
将上面的类图用代码表示如下
public class BuilderClient {
public static void main(String[] args) {
// 具体创建者
Builder builder = new ConcreteBuilder();
// 指导者
Director director = new Director(builder);
// 指导者创建产品
Product product = director.construct();
}
}
/**
* 产品角色
*/
class Product {
}
/**
* 抽象建造者
*/
interface Builder {
/**
* 产品零件1部分的建造方法
*/
void buildPart1();
/**
* 产品零件2部分的建造方法
*/
void buildPart2();
/**
* 返回完整产品
*/
Product getProduct();
}
/**
* 具体的创建者
*/
class ConcreteBuilder implements Builder {
private Product product = new Product();
@Override
public void buildPart1() {
System.out.println("创建了part1");
}
@Override
public void buildPart2() {
System.out.println("创建了part2");
}
@Override
public Product getProduct() {
return product;
}
}
/**
* 指导角色
*/
class Director {
private Builder builder;
Director(Builder builder) {
this.builder = builder;
}
Product construct() {
// 负责构建各个零件
builder.buildPart1();
builder.buildPart2();
// 获取产品
return builder.getProduct();
}
}
二、示例
/**
* REST API返回类
*/
public class RestAPIResponse<T> { // 返回码
private String code;
// 返回状态,成功或失败
private String message;
// 数据
private T data; // getter/setter }
创建返回对象的创建者
public class RestAPIResponseBuilder {
/**
* 成功返回,带数据
*/
public static <T> RestAPIResponse buildSuccessResponse(T data) {
RestAPIResponse response = new RestAPIResponse();
response.setCode("200");
response.setMessage("success");
response.setData(data);
return response;
}
/**
* 失败返回,不带数据
*/
public static RestAPIResponse buildFailureResponse(String message) {
RestAPIResponse response = new RestAPIResponse();
response.setCode("404");
response.setMessage(message);
response.setData(null);
return response;
}
}
客户端
public class Client {
public static void main(String[] args) {
/*********************没有加返回接收******************/
//返回成功
RestAPIResponse response = RestAPIResponseBuilder.buildSuccessResponse("数据");
System.out.println(response.getCode() + "|" + response.getMessage() + "|" + response.getData());
//返回失败
RestAPIResponse response2 = RestAPIResponseBuilder.buildFailureResponse("错误信息");
System.out.println(response2.getCode() + "|" + response2.getMessage() + "|" + response2.getData());
}
}
在上面这个例子中,创建者和指导者合二为一。
创建者模式-Builder的更多相关文章
- [设计模式] 3 创建者模式 builder
转载http://blog.csdn.net/wuzhekai1985/article/details/6667467 建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不 ...
- 创建者模式Builder
创建者模式: 分离对象子组件的单独构造(由Builder来负责)和装配(由Director负责),对象的构造比较复杂时使用 该模式. 类图: Builder 抽象建造者接口,规范各个组成部分的构建. ...
- 设计模式学习总结(五)创建者模式(Builder)
创建者模式,主要针对某些产品有类似的生产步骤,且有需要有先后顺序的进行各个部件的生成. 一.示例展示: 通过学习及总结,以下是我完成的创建者模式的示例: 1.创建产品类:Laptop public c ...
- 【设计模式】—— 创建者模式Builder
前言:[模式总览]——————————by xingoo 模式意图 一个对象的创建十分复杂,为了区分构建过程和使用过程,因此分开.使用一个Director类进行对象的创建,Builder规定了这个创建 ...
- (Builder)创建者模式
定义: 建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示. 适用性: 当流程算法可以固定几个步骤,步骤的算法步骤执行顺序固定,且制造的产品可以唯一确定,这时使用创建 ...
- Builder创建者模式
http://www.codeproject.com/Articles/42415/Builder-Design-Pattern In Elizabeth's day care center, the ...
- 创建类模式(三):创建者(Builder)
定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.这使得构件算法和组装方式可以独立应对变化:复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式 ...
- C#设计模式之五创建者模式(Builder)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一个复杂的物品,它主要是由CPU.主板.硬 ...
- OOAD(面向对象分析和设计)GRASP之创建者模式(Creator)又称生成器模式学习笔记
说OOAD是一门玄学,一点都不为过.又或许是因为我之前一直没有很好的建立面向对象的思想,更有可能是因为练得不够多...总之,一直没能很好理解,哪怕把一本叫做<UML和模式应用>的书翻来覆去 ...
随机推荐
- Flutter的生命週期
Flutter跟安卓的Activity.iOS的ViewController一样拥有自己的生命周期, Flutter中一切都是Widget,渲染方式有点像H5的DOM树. 先看生命周期图: Flutt ...
- 【leetcode】900. RLE Iterator
题目如下: 解题思路:非常简单的题目,直接递归就行了. 代码如下: class RLEIterator(object): def __init__(self, A): ""&quo ...
- 1,MySQL常用函数
一,MySQL聚合函数 1,AVG()函数 AVG()函数是一个聚合函数,它用于计算一组值或表达式的平均值. AVG()函数的语法如下: AVG(DISTINCT expression) 例如有如下p ...
- 「长乐集训 2017 Day8」修路 (斯坦纳树)
题目描述 村子间的小路年久失修,为了保障村子之间的往来,AAA君决定带领大家修路. 村子可以看做是一个边带权的无向图GGG, GGG 由 nnn 个点与 mmm 条边组成,图中的点从 1∼n1 \si ...
- myeclipse svn重新定位 本地文件 svn 重新定位
我们在用工具myeclipse开发项目时,当资源库存储空间不够时,我们就需要添加资源库,涉及到我们切换项目资源库,下面就介绍一下svn资源库重新定位步骤 1,window到show view到othe ...
- paper 158:CNN(卷积神经网络):Dropout Layer
Dropout作用 在hinton的论文Improving neural networks by preventing coadaptation提出的,主要作用就是为了防止模型过拟合.当模型参数较多, ...
- AT2000 Leftmost Ball(计数dp+组合数学)
传送门 解题思路 设\(f[i][j]\)表示填了\(i\)个白色,\(j\)种彩色的方案数,那么显然\(j<=i\).考虑这个的转移,首先可以填一个白色,就是\(f[i][j]=f[i-1][ ...
- python-zx笔记3-函数
一.调用函数 在交互式命令行通过help(abs)查看abs函数的帮助信息 把函数名赋给一个变量 a = abs 二.定义函数 求解方程:ax2 + bx + c = 0 # -*- coding: ...
- DZY Loves Math
DZY Loves Math 对于正整数 $n$,定义 $f(n)$ 为 $n$ 所含质因子的最大幂指数. 例如 $f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, ...
- ASP.NET MVC学习系列(二)-WebAPI请求 转载https://www.cnblogs.com/babycool/p/3922738.html
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...