建造者模式 简述

建造者模式,是将一个复杂对象的创建和它的表示分离开来,这就使得同样的构建构成可以有不同的表示。


建造者模式是一步步构建一个复杂的对象,允许用户只需要指定复杂对象的类型和必要的内容就可以构建一个完整的对象,用户不需要知道内部的具体构造细节。

建筑者模式结构

建造者模式包含如下角色:

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建造者模式的更多相关文章

  1. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  2. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  3. java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  4. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  5. Java设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  6. Java设计模式之三建造者模式和原型模式

    建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...

  7. 设计模式-05建造者模式(Builder Pattern)

    1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...

  8. java设计模式之建造者模式

    学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...

  9. java设计模式之四建造者模式(Builder)

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...

  10. java设计模式3.建造者模式、原型模式

    建造者模式 一个产品常有不同的组成部分作为产品的零件,有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,有些时候,一个对象的一些性质必须按照某个顺序赋值才 ...

随机推荐

  1. win10系统查看激活状态及是否永久激活

    查看windows系统是否激活 找到“此电脑”,右击“属性” 查看windows系统是否永久激活 第一种方法 win+r 进入运行,输入slmgr.vbs -xpr  如图,再点击确定. 弹出一个对话 ...

  2. Visual Studio新建类自动添加注释

    修改 VS中新建类的模板 如以下地址:D:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSha ...

  3. gperftools源码分析和项目应用 - CPU Profiler

    gperftools源码分析和项目应用 - CPU Profiler 原文:https://blog.csdn.net/yubo112002/article/details/81076821 原文链接 ...

  4. python numpy array 的sum用法

    如图: sum可以指定在那个轴进行求和: 且第0轴是纵向,第一轴是横向:

  5. HTML and CSS basis

    classes 和 IDs 的不同 class 选择器用于描述一组元素的样式,class 选择器有别于id选择器,class可以在多个元素中使用. HTML 元素 elements 从开始标签(sta ...

  6. php 限制标题长度,将一个中文转换成一个字符

    点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5UJ9vEa 欢迎大家加入,一起讨论学习 玩这个功能的时候,我们要注意一点,我们是用中 ...

  7. ASE19团队项目alpha阶段model组 scrum11 记录

    本次会议于11月15日,19时整在微软北京西二号楼sky garden召开,持续5分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing W ...

  8. css 之引入自定义字体/特殊字体-----使用ttf格式语言包

    1.准备好需要的 .ttf 格式的语言包,在css导入: @font-face { font-family: myFont; src: url('../assets/font/Oswald-SemiB ...

  9. 9. A Pythonic Object

    Thanks to the Python data model, your user-defined types can behave as naturally as the built-in typ ...

  10. 团队第三次作业:Alpha版本第二周小结

    姓名 学号 周前计划安排 每周实际工作记录 自我打分 XXX 061109 1.对原型设计与编码任务进行进一步的规划与任务分配 2.协调与统一已完成的部分原型设计页面风格并针对部分页面提出了改进建议 ...