建造者模式 简述

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


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

建筑者模式结构

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

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. c#本地文件配置xml

    /// <summary> /// 处理xml文件 /// </summary> public class HandelXmlFile { private string _co ...

  2. vue组件之间的传值

    vue中组件之间的传值有好几种情况 1.父向子传值 父组件向子组件传值使用props,直接上实例 city.vue是父组件,list.vue是子组件city.vue里定义cities和hotCitie ...

  3. C语言——指针总结

    在创建指针时,我们首先要做的是先初始化它,没有初始化的指针是很危险的,因为指针可以指向一个地址后直接改变它的值,所以为了避免我们的指针在创建后指向一个危险区域(即可能指向系统文件等),我们会先给它一个 ...

  4. CSS 实现居中 + 清除浮动

    一.水平居中 1.行内元素:text-align:center; 2.块级元素:margin:0 auto; 3.绝对定位和移动:absolute + transform 4.绝对定位和负边距:abs ...

  5. c#如何使用MemoryStream和BinaryFormatter进行对象的序列化和返序列化

    1 下面是我写的一个序列化的类 public static class ObjSerialize { /// <summary> /// 将对象数组obj序列化,内存中的缓冲区的数据序列化 ...

  6. docker-compose deploy replicaSet in standalone MongoDB cluster and with auth

    经过两天的折腾,终于实现了自己想要的效果,就是通过docker-compose 部署最新的mongodb replicaSet, 主要是为了测试 4.2 最新的多文档事务,下面将整个步骤分享一下: d ...

  7. MySQL间隙锁问题

    间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间. 最近用户反馈说系统老是出现insert时,等待超时了,最后发现是ins ...

  8. rabbimq 生产消费者

    composer.json { "require": { "php-amqplib/php-amqplib": "^2.9" } } com ...

  9. CHD-5.3.6集群安装

    我是基于Apache-hadoop2.7.3版本安装成功后,已有的环境进行安装chd-5..6 已用的环境: JDK版本: java version "1.8.0_191" Jav ...

  10. docker images 导入和导出

    目录 docker images 导入和导出 1.前言 2.docker image 的保存 3.docker image 的导入 docker images 导入和导出 1.前言 前提是现在有一个可 ...