建造者模式 简述

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


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

建筑者模式结构

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

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. Codeforces 1097F. Alex and a TV Show

    传送门 由于只要考虑 $\mod 2$ 意义下的答案,所以我们只要维护一堆的 $01$ 容易想到用 $bitset$ 瞎搞...,发现当复杂度 $qv/32$ 是可以过的... 一开始容易想到对每个集 ...

  2. spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目

    spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目 [V1.2.3-RELEASE] 2019.09.09

  3. [http]HTTP请求过程

    我们在浏览器输入http://www.baidu.com想要进入百度首页,但是这是个域名,没法准确定位到服务器的位置,所以需要通过域名解析,把域名解析成对应的ip地址,然后通过ip地址查找目的主机.整 ...

  4. css选择器找亲戚

    1.first-child first-child表示选择列表中的第一个标签.代码如下: li:first-child{background:#090} 上面的意思是,li 列表中的 第一个li模块的 ...

  5. Android SQLiteDatabase的使用

    package com.shawn.test; import android.content.ContentValues; import android.content.Context; import ...

  6. S5PV210 点亮Led

    GPC1CON, R/W, Address = 0xE020_0080 GPC1DAT, R/W, Address = 0xE020_0084 举例 #define GPC1CON *((volati ...

  7. DX使用随记--ImageComboBoxEdit

    1. 增加按钮: Combo_订单类型.Properties.Items.Clear()Select Case Combo_客户名称.EditValue Case "ABC" Co ...

  8. 10.SpringMVC注解式开发-处理器方法的参数

    1.逐个参数接收 只要保证请求参数名与该请求处理方法的参数名相同即可 // 请求参数名 与该处理器中的请求方法的参数名相同 ,即可接收前台传递过来的参数 public ModelAndView met ...

  9. c#复制文件夹和文件

    /// <summary> /// 拷贝文件夹 /// </summary> /// <param name="srcdir"></par ...

  10. asp.net使用FileUpload控件上传图片且重命名

    我在根目录下创建了一个Images图片存放文件夹,上传的图片都在这 下面贴代码 if (FileUpload1.HasFile) { string filename = FileUpload1.Fil ...