流水作业大家应该都清楚吧!在流水作业中,我们可以将一些复杂的东西给构建出来,例如汽车。我们都知道汽车内部构件比较复杂,由很多部件组成,例如车轮、车门、发动机、方向盘等等,对于我们用户来说我们并不需要知道这个汽车是如何构建出来的,它的各个部件是如何组装,我们只需要知道一点:这是一辆完整的汽车。同样KFC也是这样的,在KFC中我们吃套餐也不需要知道这个套餐是怎样做出来的,我们只需要在店里面向服务员点就可以得到相应的套餐了。对于这两个例子我们通过指定某个对象类型就可以得到一个完整的对象,而无须关心其内部的构建。

在软件开发中,也会存在一些构造非常复杂的对象,这些对象拥有一系列的成员属性,这些成员属性有些是基本数据类型,有些是引用类型,总之就是一句话,这个对象的构建比较复杂。在这里我们就将复杂对象当做汽车,成员属性当做部件,对象的构建当做汽车的组合。对于用户而言我们总是希望我们在使用对象时足够简单,如果一个复杂的对象直接丢给用户,用户会是痛苦不堪的(给你一堆部件,你来组装成一辆汽车看看),除了这个构建的过程外,可能用户会忘记某些成员属性。所以我们就希望能够像使用汽车一样使用复杂的对象:直接告诉你我需要的对象名或者对象类型,你返回一个完成的对象实例给我。建造者返回给客户一个完整的的产品对象,而客户端无须关心该对象所包含的额属性和组建方式,这就是建造者模式的设计动机。

一、模式定义

建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式构建复杂对象就像造汽车一样,是一个一个组件一个一个步骤创建出来的,它允许用户通过制定的对象类型和内容来创建他们,但是用户并不需要知道这个复杂对象是如何构建的,它只需要明白通过这样做我可以得到一个完整的复杂对象实例。

二、模式结构

建造者模式的UML结构图:

建造者模式主要包含四个角色:

Builder:抽象建造者。它声明为创建一个Product对象的各个部件指定的抽象接口。 
      ConcreteBuilder:具体建造者。实现抽象接口,构建和装配各个部件。 
      Director:指挥者。构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。 
      Product:产品角色。一个具体的产品对象。

三、模式实现

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

      首先是套餐类:Meal.java

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;}
}

然后是套餐构造器:MealBuilder.java

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、将产品的创建过程与产品本身分离开来,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。

3、每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。

缺点

1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。 
      2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

五、模式适用场景

1、需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。 
      2、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

六。模式总结

1、建造者模式是将一个复杂对象的创建过程给封装起来,客户只需要知道可以利用对象名或者类型就能够得到一个完整的对象实例,而不需要关心对象的具体创建过程。

2、建造者模式将对象的创建过程与对象本身隔离开了,使得细节依赖于抽象,符合依赖倒置原则。可以使用相同的创建过程来创建不同的产品对象。

转载原文链接:https://www.cnblogs.com/chenssy/p/3307787.html

转载于:https://www.cnblogs.com/cs-forget/p/8073697.html

读书笔记——5建造者模式(转)相关推荐

  1. 【读书笔记】建造者模式代码完成与大家分享

    建造者模式的好处就是隐藏了产品时如何组装产品,建造者模式主要用于一些复杂的对象,内部建造的顺序是固定的,但是每部建造的过程有很大的变化. C#代码:/Files/cappuccino/BuilderM ...

  2. 《自己动手写操作系统》读书笔记——初识保护模式

    <自己动手写操作系统>读书笔记--初识保护模式 http://www.cnblogs.com/pang123hui/archive/2010/11/27/2309930.html 书本第三 ...

  3. 设计模式之禅读书笔记—行为类模式

    设计模式之禅读书笔记-行为类模式 PDF下载地址 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式 责任链模式 定义:使多 ...

  4. 设计模式读书笔记-----工厂方法模式

    一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...

  5. [设计模式笔记]4.建造者模式

    主要解决:在整个软件系统中,面临着一个复杂对象的创建工程,通常由各个部分的子对象用一定的算法构成,由于需求的变化,这个负载对象的各个部分面临着剧烈的变化. 何时使用:一些基本部分不变,而组合经常变化时 ...

  6. #读书笔记 Android-Activity启动模式

    什么是Activity的启动模式?当启动一个Activity的时候,系统会创建一个实例,并把它放入到一个任务栈中,至于如何存放,就是由这个启动模式来决定的.Android系统支持多任务,所以系统中会同 ...

  7. 大话设计模式读书笔记--4.代理模式

    生活中的例子: 班主任让班长通知班委下午3点开会 班长就是班主任的代理 代理模式的目的是: 隐藏真实访问对象,同时可以处理别的事情 定义 代理模式:为其他对象提供一种代理以控制对这个对象的访问 也就是 ...

  8. 大话设计模式读书笔记--6.原型模式

    简单的复制粘贴极有可能造成重复代码的灾难, 但是java中提供了克隆的功能, 如果一个对象创建过程复杂,又要频繁使用, 在初始化信息不发生变化的情况下,应当采取克隆而不是new一个对象 定义 原型模式 ...

  9. JavaScript设计模式与开发实践---读书笔记(6) 代理模式

    代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. 代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对象 ...

  10. 大话设计模式读书笔记10----外观模式(Facade)

    外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更容易使用. 1.在设计初级阶段,应该要有意识的将不同的两个层分离. 2.层与层之间建 ...

最新文章

  1. hdu - 1087 - Super Jumping! Jumping! Jumping!
  2. HTML的标签描述2
  3. linux c 字符串函数 replace indexOf substring 实现
  4. ubuntu查看文件和文件夹大小
  5. 体素科技:2018年,算法驱动下的医学影像分析进展
  6. spring boot 开发 提交form表单出错
  7. markdown 笔记
  8. Python: datetime 转换
  9. linux如何ARP嗅探 Linux下嗅探工具Dsniff安装记录
  10. android--系统jar包引用
  11. mybatisplus报的mysql错误归纳
  12. [3]、Swagger——解决前后端打架问题
  13. Matlab颜色RGB值
  14. Linux中压缩文件后生成,在 Linux系统中,压缩文件后生成后缀为.gz文件的命令是 gzip 。...
  15. 适于硬件实现的中值滤波算法
  16. html 怎么检测ie浏览器的最高版本号,怎样在HTML代码里面判断IE版本?
  17. sonar问题:Font declarations should contain at least one generic font family
  18. Python绘图Turtle库画圈
  19. 6位你必须知道的产品大神
  20. linux查看电脑耗电量,命令行 - 在Linux上,观察程序耗电量使用的最佳方法是什么?...

热门文章

  1. 小议 - 来自《XX时代XX公司》的笔试编程题目
  2. DOM技术对xml增删改查后更新源文件异常报错
  3. windows2008下运行环境部署(iis,ftp,oracle)
  4. 如何关闭MyEclipse自动更新
  5. 业余草教你简单 4 步搞定 SpringBoot 整合 Shiro!
  6. Just for fun--Linus
  7. 数据结构——>稀疏数组
  8. 2021-1-28Linux学习纪要
  9. list vue 添加数据方法_在PySpark数据框中添加新列的5种方法
  10. java 字符流异常处理_IO字符流9jdk7和jdk9中流的异常的处理