【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.建造者模式、原型模式
建造者模式 一个产品常有不同的组成部分作为产品的零件,有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,有些时候,一个对象的一些性质必须按照某个顺序赋值才 ...
随机推荐
- JSON运用在文件
#include <iostream>#include <fstream>#define JSON_IS_AMALGAMATION#include "json/jso ...
- Advanced Installer 开始-程序那里增加,快捷方式、卸载软件、官方网站
. 这个是效果.
- vue学习(10)-vue-resource
下载:cnpm i vue-resource --save 在main.js导入包:import VueResource from 'vue-resource' 安装:Vue.use(VueResou ...
- VBA基本用法
Visual Basic for Applications 宏语言 打开VB编辑器 首先打开Excel,组合键Alt+F11 加载宏 找到相应的宏,点击"执行" 举例 Sub 评分 ...
- websocket + TP5.1 + apache 配置步骤
websocket + TP5.1 + apache 配置步骤 1. https ssl配置好 2. 检查php环境是否满足Workerman要求 curl -Ss http://www.worker ...
- 【url ---lib___】笔趣阁(抓取斗罗大陆完整)和(三寸天堂)
# coding=gbk #因为在黑屏下执行,所以代码会使用GBK url='http://www.biquge.info/10_10218/' UA={"User-Agent": ...
- zip命令分卷压缩和解压缩
创建分卷压缩文件 zip -s 100m -r folder.zip folder/ -s: 创建分卷的大小 -r: 循环压缩文件夹下面的内容 切分已有的文件: zip existing.zip -- ...
- Delphi 数组特性
- GITHUB readme基本语法
一.标题写法: 第一种方法: 1.在文本下面加上 等于号 = ,那么上方的文本就变成了大标题.等于号的个数无限制,但一定要大于0个哦.. 2.在文本下面加上 下划线 - ,那么上方的文本就变成了中标题 ...
- 三:MVC之Lambda表达式
Lambda表达式 Lambda表达式是一个匿名方法,即没有方法名的方法. C#中的Lambda表达式使用Lambda运算符“=>”,该运算符读为“goes to”. 语法: 形参列表=> ...