【java设计模式】-05建造者模式
建造者模式 简述
建造者模式,是将一个复杂对象的创建和它的表示分离开来,这就使得同样的构建构成可以有不同的表示。
建造者模式是一步步构建一个复杂的对象,允许用户只需要指定复杂对象的类型和必要的内容就可以构建一个完整的对象,用户不需要知道内部的具体构造细节。
建筑者模式结构
建造者模式包含如下角色:
Builder:抽象建造者
ConcreteBuilder:具体建造者
Director:指挥者
Product:产品角色

代码实例
/**
* 肯德基套餐实体
*
* @author kaifeng
* @date 2018/8/19
*/
@ToString
@Data
public class KFCPackage {
/**
* 食物
*/
private String food;
/**
* 饮料
*/
private String drink;
}
/**
* 肯德基套餐构造器(抽象建造者)
*
* @author kaifeng
* @date 2018/8/19
*/
public abstract class AbstractPackageBuilder {
/**
* 套餐对象
*/
protected KFCPackage kfcPackage;
public KFCPackage getKfcPackage() {
return kfcPackage;
}
public void createKfcPackage() {
kfcPackage = new KFCPackage();
}
/**
* 构造食物
*/
public abstract void buildFood();
/**
* 构造饮料
*/
public abstract void buildDrink();
}
/**
* A套餐构造器(具体建造者)
*
* @author kaifeng
* @date 2018/8/19
*/
public class KFCPackageBuilderA extends AbstractPackageBuilder {
/**
* 构造食物
*/
@Override
public void buildFood() {
kfcPackage.setFood("A-香辣鸡腿堡");
}
/**
* 构造饮料
*/
@Override
public void buildDrink() {
kfcPackage.setDrink("A-可口可乐(中杯)");
}
}
/**
* B套餐构造器(具体建造者)
*
* @author kaifeng
* @date 2018/8/19
*/
public class KFCPackageBuilderB extends AbstractPackageBuilder {
/**
* 构造食物
*/
@Override
public void buildFood() {
kfcPackage.setFood("B-半鸡半虾堡");
}
/**
* 构造饮料
*/
@Override
public void buildDrink() {
kfcPackage.setDrink("B-咖啡");
}
}
/**
* 肯德基点餐员(指挥者)
*
* @author kaifeng
* @date 2018/8/19
*/
public class KFCWaiter {
private AbstractPackageBuilder packageBuilder;
public void setPackageBuilder(AbstractPackageBuilder packageBuilder){
this.packageBuilder=packageBuilder;
}
public KFCPackage getKfcPackage(){
return packageBuilder.getKfcPackage();
}
public void constructPackage() {
packageBuilder.createKfcPackage();
packageBuilder.buildFood();
packageBuilder.buildDrink();
}
}
/**
* 构造器模式测试
*
* @author kaifeng
* @date 2018/8/19
*/
public class BuilderDemo {
public static void main(String[] args) {
//实例化点餐员对象(指挥者)
KFCWaiter kfcWaiter = new KFCWaiter();
//实例化产品套餐
AbstractPackageBuilder packageBuilderA = new KFCPackageBuilderA();
AbstractPackageBuilder packageBuilderB = new KFCPackageBuilderB();
//构造A套餐
kfcWaiter.setPackageBuilder(packageBuilderA);
kfcWaiter.constructPackage();
KFCPackage kfcPackageA = kfcWaiter.getKfcPackage();
System.out.println(kfcPackageA.toString());
//构造B套餐
kfcWaiter.setPackageBuilder(packageBuilderB);
kfcWaiter.constructPackage();
KFCPackage kfcPackageB = kfcWaiter.getKfcPackage();
System.out.println(kfcPackageB.toString());
}
}
优点
1、在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
2、每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。
3、将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
4、增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
缺点
1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
适用场景
在以下情况下可以使用建造者模式:
1、需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
2、需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
3、对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
4、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
扩展
省略抽象建造者角色:如果系统中只需要一个具体建造者的话,可以省略掉抽象建造者。
省略指挥者角色:在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略指挥者角色,让Builder角色扮演指挥者与建造者双重角色。
【java设计模式】-05建造者模式的更多相关文章
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
- java设计模式3——建造者模式
java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- Java设计模式之三 ----- 建造者模式和原型模式
前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...
- Java设计模式之三建造者模式和原型模式
建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...
- 设计模式-05建造者模式(Builder Pattern)
1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...
- java设计模式之建造者模式
学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...
- java设计模式之四建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...
- java设计模式3.建造者模式、原型模式
建造者模式 一个产品常有不同的组成部分作为产品的零件,有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,有些时候,一个对象的一些性质必须按照某个顺序赋值才 ...
随机推荐
- 由[].slice.call()引发的思考
由[].slice.call()引发的思考 经常看到大家用[].slice.call()或者Array.prototype.slice.call(): 我一直是一知半解的,今天算是基本弄清楚了, ...
- C# 将一种类型的数组转化为另一种类型的数组
//字符串数组(源数组) "}; //整型数组(目标数组) int[] iNums; //转换方法 iNums = Array.ConvertAll<string, int>(s ...
- Sharepoint2010设置自定义母版页
前言 这个文档是为Microsoft Sharepoint2010 上海文档库公司站点设计的母版页,其版本为1.0,为相关的源文件编写的使用说明书. 使用SharePoint Designer 201 ...
- Oracle设置权限和还原数据库
Oracle还原数据库 ,在最高权限账户上,先将安装好的数据上创建一个账户 -- Create the user create user newsafe identified by newsafe d ...
- [转载]PyTorch上的contiguous
[转载]PyTorch上的contiguous 来源:https://zhuanlan.zhihu.com/p/64551412 这篇文章写的非常好,我这里就不复制粘贴了,有兴趣的同学可以去看原文,我 ...
- arcgis js之点击获取featureLayer中的点
arcgis js之点击获取featureLayer中的点 代码: this.view.on('click', (evt) => { let layer = this.map.findLayer ...
- JavaScript之排序算法
一.冒泡排序 原理:1.比较相邻的元素.如果第一个比第二个大,就交换两个数:2.对每一对相邻元素重复做步骤一,从开始第一对到结尾的最后一对,该步骤结束会产生一个最大的数:3.针对所有的数重复以上的步骤 ...
- BRD——>MRD——>PRD,产品经理三大文档概念详解及前后逻辑
转自:https://blog.csdn.net/neikutaixiao/article/details/40819445 商业需求文档Business Requirement DocumentBR ...
- C语言memset函数详解
C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即“内存”(memory)的意思.该函数的原型为: # ...
- CHD-5.3.6集群上oozie安装
参考文档:http://archive.cloudera.com/cdh5/cdh/5/oozie-4.0.0-cdh5.3.6/DG_QuickStart.html tar -zxvf oozie ...