一、什么是建造者模式:

建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程;通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来,使得同样的构建过程可以创建不同的对象;并且每个具体建造者都相互独立,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。

但建造者模式的缺陷是要求创建的产品具有较多的共同点、组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式。同时如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

二、UML结构图:

  • 抽象建造者 Builder:相当于建筑蓝图,声明了创建 Product 对象的各个部件指定的抽象接口。
  • 具体建造者 ConcreteBuilder:实现Builder抽象接口,构建和装配各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
  • 指挥者 Director:构建一个使用 Builder 接口的对象。主要有两个作用,一是隔离用户与对象的生产过程,二是负责控制产品对象的生产过程。
  • 产品角色 Product:被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

三、代码实现:

KFC里面一般都有好几种可供客户选择的套餐,它可以根据客户所点的套餐,然后在后面做这些套餐,返回给客户的事一个完整的、美好的套餐。下面我们将会模拟这个过程,我们约定套餐主要包含汉堡、薯条、可乐、鸡腿等等组成部分,使用不同的组成部分就可以构建出不同的套餐。

首先是套餐类:

public class Meal {private String food;private String drink;public String getFood() {return food;}public void setFood(String food) {this.food = food;}public String getDrink() {return drink;}public void setDrink(String drink) {this.drink = drink;}
}

套餐构造器:

public abstract class MealBuilder {Meal meal = new Meal();public abstract void buildFood();public abstract void buildDrink();public Meal getMeal(){return meal;}
}

套餐A、套餐B。这个两个套餐都是实现抽象套餐类:

public class MealA extends MealBuilder{public void buildDrink() {meal.setDrink("一杯可乐");}public void buildFood() {meal.setFood("一盒薯条");}}
public class MealB extends MealBuilder{public void buildDrink() {meal.setDrink("一杯柠檬果汁");}public void buildFood() {meal.setFood("三个鸡翅");}}

最后是KFC的服务员,它相当于一个指挥者,它决定了套餐是的实现过程,然后给你一个完美的套餐。

public class KFCWaiter {private MealBuilder mealBuilder;public void setMealBuilder(MealBuilder mealBuilder) {this.mealBuilder = mealBuilder;}public Meal construct(){//准备食物mealBuilder.buildFood();//准备饮料mealBuilder.buildDrink();//准备完毕,返回一个完整的套餐给客户return mealBuilder.getMeal();}
}

测试类:

public class Client {public static void main(String[] args) {//服务员KFCWaiter waiter = new KFCWaiter();//套餐AMealA a = new MealA();//服务员准备套餐Awaiter.setMealBuilder(a);//获得套餐Meal mealA = waiter.construct();System.out.print("套餐A的组成部分:");System.out.println(mealA.getFood()+"---"+mealA.getDrink());}
}

运行结果:

套餐A的组成部分:一盒薯条---一杯可乐

四、抽象工厂模式和建造者模式的区别:

两者都是创建型模式,并且最终都是得到一个产品,但两者的区别在于:

1、抽象工厂模式实现对产品族的创建,产品族指的是不同分类维度的产品组合,用抽象工厂模式不需要关心具体构建过程,只关心产品由什么工厂生产即可。而建造者模式则更关心的是对象的构建过程,要求按照指定的蓝图建造产品,主要目的是通过组装零配件而产生一个新产品。

2、在抽象工厂模式中使用“工厂”来描述构建者,而在建造者模式中使用“车间”来描述构建者。

(1)抽象工厂模式就好比是一个一个的工厂,宝马车工厂生产宝马SUV和宝马VAN,奔驰车工厂生产奔驰车SUV和奔驰VAN,它是从一个更高层次去看对象的构建,具体到工厂内部还有很多的车间,如制造引擎的车间、装配引擎的车间等,但这些都是隐藏在工厂内部的细节,对外不公布。也就是对领导者来说,他只要关心一个工厂到底是生产什么产品的,不用关心具体怎么生产。

(2)建造者模式就不同了,它是由车间组成,不同的车间完成不同的创建和装配任务,一个完整的汽车生产过程需要引擎制造车间、引擎装配车间的配合才能完成,它们配合的基础就是设计蓝图,而这个蓝图是掌握在车间主任(Director类)手中,它给建造车间什么蓝图就能生产什么产品,建造者模式更关心建造过程。虽然从外界看来一个车间还是生产车辆,但是这个车间的转型是非常快的,只要重新设计一个蓝图,即可产生不同的产品,这有赖于建造者模式的功劳。

3、相对来说,抽象工厂模式比建造者模式的粒度要大,它关注产品整体,而建造者模式关注构建过程,所以建造者模式可以很容易地构建出一个崭新的产品,只要指挥类 Director 能够提供具体的工艺流程。也正因为如此,两者的应用场景截然不同,如果希望屏蔽对象的创建过程,只提供一个封装良好的对象,则可以选择抽象工厂方法模式。而建造者模式可以用在构件的装配方面,如通过装配不同的组件或者相同组件的不同顺序,可以产生出一个新的对象,它可以产生一个非常灵活的架构,方便地扩展和维护系统。


设计模式系列文章:

Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)

Java设计模式之创建型:建造者模式

Java设计模式之创建型:单例模式

Java设计模式之创建型:原型模式

Java设计模式之结构型:适配器模式

Java设计模式之结构型:装饰器模式

Java设计模式之结构型:代理模式

Java设计模式之结构型:桥接模式

Java设计模式之结构型:外观模式

Java设计模式之结构型:组合模式

Java设计模式之结构型:享元模式

Java设计模式之行为型:策略模式

Java设计模式之行为型:模板方法模式

Java设计模式之行为型:责任链模式

Java设计模式之行为型:观察者模式

Java设计模式之行为型:访问者模式

Java设计模式之行为型:中介者模式

Java设计模式之行为型:命令模式

Java设计模式之行为型:状态模式

Java设计模式之行为型:备忘录模式

Java设计模式之行为型:迭代器模式

Java设计模式之行为型:解释器模式


原文链接:

设计模式读书笔记-----建造者模式_chenssy 的技术博客-CSDN博客

Java设计模式之创建型:建造者模式相关推荐

  1. Java设计模式之创建型-建造者模式 (Builder)

  2. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  3. Java设计模式之创建型:单例模式

    一.什么是单例模式: 单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例.单例模式的优点在于: 系统中只存在一个 ...

  4. Java设计模式之创建型模式

    一.创建型模式 1.工厂模式[Factory] 定义:工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式. 普通工厂:工厂是具体的,产品是抽象的.[学习难度:★★☆☆☆,使用 ...

  5. 设计模式之美(4)-创建型-建造者模式

    Builder模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式. 建造者模式原理和代码非常简单, 难点在于应用场景.比如直接使用构造函数或者配合set方法就能创建对象,为什么还需要建造者 ...

  6. java设计模式之创建型设计模式

    创建型设计模式: 抽象工厂(Abstract Factory): 用途:提供一个接口以创建一系列相关或相互依赖的对象,而无需指定具体的类. 场景: 一个系统要独立于它的产品的创建. 一个系统要由多个产 ...

  7. 大聪明教你学Java设计模式 | 第二篇:建造者模式

    前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...

  8. myeclipse怎么创建jframe类_创建型-建造者模式

    一个对象创建的时候,需要各种初始化化,有一套复杂的创建流程,如果这些流程散布在系统各个地方的话,会越来越难以维护,因此建造者模式就是把一套复杂的创建某个具体产品的流程,管理起来. 定义: 将一个复杂的 ...

  9. java设计模式(五)--建造者模式(Builder)

    转载:http://zz563143188.iteye.com/blog/1847029 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象 ...

最新文章

  1. 最全三大框架整合(使用映射)——Emp.hbm.xml
  2. 如何搭建socks5和ss节点_redis cluster搭建实践(非常详细,值得收藏)
  3. python 曲面_Python之OpenGL笔记(35):曲面物体的构建
  4. java返回object的类型_为什么标准java类的clone()返回Object而不是实际的类型
  5. 飞秋2010下载不仅野草是如此
  6. mysql数据库表分区_MySQL数据库之MySQL的分区和分表详解
  7. 用R进行文本挖掘与分析:分词、画词云
  8. Android P Beta!您想要知道的所有更新内容都在这里
  9. 数据库小结2--提升
  10. 现代通信原理10.2:采用匹配滤波器的数字基带传输系统误码性能分析
  11. 值得注意的两个friendster新服务:校友和web共享搜索
  12. 经济学原理上中国故事2019尔雅满分答案
  13. Jetson Xavier NX系统安装至 nvme 硬盘
  14. 自动化控制重要国际学术会议
  15. Unity VR学习:第一人称射击游戏(1)
  16. Python实训day04am【爬虫介绍、爬取网页测试、Python第三方库】
  17. 在线制作网站sitemap并提交
  18. CS 188 (4) Uniform Cost Search( 统一代价搜索算法)
  19. 【工具】目前几种常见的线上接口文档管理平台的比较
  20. HC-05蓝牙模块,在AT指令模式时输出AT+NAME?无应答问题

热门文章

  1. Python工程师学习笔记
  2. 报名|第2期“DI极客说”,揭秘决策AI创新应用带来的行业变革
  3. 斯坦福助理教授马腾宇:ML非凸优化很难,如何破?
  4. ACM Computing Surveys 2021:基于会话推荐系统的最新长文综述
  5. Word Embedding List|ACL 2020 词嵌入长文汇总及分类
  6. EMNLP2018论文解读 | 利用篇章信息提升机器翻译质量
  7. 在指定文件夹下打开Jupyter Notebook
  8. 什么是连续潮流cpf_2019童装秋冬潮流趋势报告:一文读懂童装潮流四大消费趋势...
  9. bootstrap下拉选择框选中事件_CAD制图初学入门之CAD软件中布局功能详解
  10. spring原始注解开发-01