网上博客很多使用KFC套餐来做的例子,讲述地不够贴切,觉得容易误导读者,在那个例子中KFC的套餐(ConcretedBulider)的具体内容被消费者(Client)清楚地了解且也是其关心的点,但是在建造者模式里消费者并不了解也不关心产品的创建过程,而在例子中建造者(Builder)也只是简单地提供了可乐、薯条等等,然后配餐人员(Direactor)进行组合,最后提供到消费者手上。但是,我们试着用外观者模式去套,基础部件就是可乐、薯条、各种汉堡,假设本来消费者是自助的形式自己随意拿可乐+薯条+汉堡,然后到收银员付款,这样,收银员每次都要计算各种组合的价格。现在改了,收银员直接出售各种组合,组合方式由套餐(Facade)决定,面向消费者(Client)就固定这些组合,由其自己选择套餐。这样看来,建造者模式和外观模式貌似差不多,都是在基础层之上,多了一层包装,开放简洁的接口给调用者使用。但实际上,建造者模式是创建型的模式,外观模式是结构型的模式,误导就出现在博主阐述例子的切入点不合理:

1.建造者模式

依然使用KFC套餐的例子,但是,在建造者模式中,我们的关注产品不是套餐,而是其中一个具体产品,比如分解一个汉堡的制作过程:准备两片面包、两片生菜、10g沙拉酱(还有各种其他酱料)、一片鸡腿肉(各种制作方法而成的肉),其中面包需要加热、生菜需要清洗、沙拉酱选择xxx牌的、鸡腿肉需要清洗烤制加各种定量的佐料,即流程固定。我们用类来表示这个过程如下:

public abstract class HambergerBuilder {
public abstract voidgetLettuce();//备生菜
public abstract voidget2bread();//备2片面包
public abstract voidgetSauce();//备酱料,具体那种由实现类决定
public abstract voidgetChicken();//备鸡肉,具体那种由实现类决定
}
public class HambergerABuiler extends HambergerBuilder {
@Override
public void getLettuce() {
System.out.println("取生菜2片并用纯水清洗干净");
}
@Override
public void get2bread() {
System.out.println("取两片面包烤箱加热");
}
@Override
public void getSauce() {
System.out.println("取10g沙拉酱加到面包内层");
}
@Override
public void getChicken() {
System.out.println("取用方法A烤制的秘制鸡腿肉");
}
}
public class KFCDirector {
public void construct(HambergerBuilder builder){
builder.get2bread();
builder.getLettuce();
builder.getSauce();
builder.getChicken();
System.out.println("打完收工~~");
}
}
public class Main {
public static void main(String[] args) {
HambergerBuilderA=newHambergerABuiler();
KFCDirectordirector=newKFCDirector();
director.construct(A);
}
}

从这个切入点描述建造者模式,我们可以看到,消费者并不知道也不关心汉堡是如何被造出来的,而且我们可以通过类似于HambergerABuiler这个类的“配方”去制造各种各样的汉堡,反正汉堡的制造过程“都是”面包夹生菜和肉,再加点酱料嘛~~

然后再回到建造者模式的适用型定义:建造者模式是在当创建复杂对象(Hamberger)的算法(KFCDirector)应该独立于该对象组成部分(HambergerBuilder抽象方法 )以及他们的装配方式(HambergerBuilder 中的具体方法)时适用的模式,或者说各个构件间的建造顺序的是稳定的,但是构件内部是多变的。

2.外观模式

继续KFC的例子,现在我们用建造者模式,建造了好多单品,汉堡A、汉堡B、薯条、可乐……消费者过来消费时对于品类繁多的单品出现了选择困难症(原系统内部类过多),同时面对各种单品的优惠销售策略,比如薯条满30送可乐等等不知所措(原系统个各个类之间逻辑复杂),所以KFC推出简单易选的套餐A、套餐B(Facade),由于外观模式代码比较单间就不列了。

本文用同一个例子的不同切入点,重新阐述了外观模式和建造者模式的区别,希望不要再被原来的例子误解了。

[设计模式](二)外观模式和建造者模式的区别相关推荐

  1. java设计模式之原型模式和建造者模式的写法(二)

    背景 原型模式和建造者模式属于创建型模式,在开发中经常会用到,那么这两种设计模式是怎么写的呢,下面进行代码演示. 原型模式 原型模式的核心就是复制 package com.example.protot ...

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

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  3. C#设计模式学习笔记:(4)建造者模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7614630.html,记录一下学习过程以备后续查用.一.引言在现实生活中,我们经常会遇到一些构成比较复杂的物 ...

  4. 设计模式之---工厂模式、建造者模式

    ☺ 对于工厂模式,个人学习需要掌握 注意答案的重点标黑了.对于工厂模式.建造者模式,掌握,我下面这几点就很棒棒. 一.工厂模式 1.什么是工厂模式:[关键字factory] 答:创建对象时,不直接ne ...

  5. 【设计模式】第6章·建造者模式

    一.建造者模式概述 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 二.建造者模式结构与实现 2.1 建造者模式结构 建造者模式包含以下4个角色: Builde ...

  6. 常用设计模式系列(四)—建造者模式

    第一节 前言 "山不在高,有仙则名.水不在深,有龙则灵.斯是陋室,惟吾德馨.苔痕上阶绿,草色入帘青.谈笑有鸿儒,往来无白丁.可以调素琴,阅金经.无丝竹之乱耳,无案牍之劳形.南阳诸葛庐,西蜀子 ...

  7. 设计模式:工厂模式和建造者模式

    工厂模式和建造者模式都是创建型模式,说白了都是为了创建对象为目标用途的设计模式.肯定会拿来比较,一般来说肯定是工厂模式更易懂,使用在平时的项目中更顺手.而建造者模式,更多是创建一个对象,要给这个对象给 ...

  8. 大话设计模式(3)——造物者一般的建造者模式

    本来建造者模式是放到后面才写的,但有群友催稿,并且点明需要看看建造者模式来满足工作上的需要,也就有了这篇文章. 什么是建造者模式? 建造者模式归纳起来其实就一句话:女娲造人,形态各异. 传说女娲是用泥 ...

  9. 设计模式篇(3)——建造者模式深度阐述

    文章目录 3.4 建造者模式 3.4.1 角色: 3.4.2 使用场景 3.3.3 代码实现 3.4.4 与工厂模式对比 3.4 建造者模式 定义:建造者模式(Builder Pattern)又叫生成 ...

最新文章

  1. python 给字典排序
  2. js插件---JS表格组件BootstrapTable行内编辑解决方案x-editable
  3. 函数:使用递归实现阶乘
  4. Spark On YARN 集群安装部署
  5. 如何控制参照PR作PO时,PO的数量不能超过PR的数量
  6. PHP性能调优---php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)
  7. C++ Builder 导入 lib 库语法
  8. SQL Server 2008 R2 中不能删除复制(replication) 的解决方法
  9. centos7输入法,非root用户无法使用
  10. 计算机网络基础大学教材,《计算机网络技术及应用——大学计算机基础教育规划教材》低价购书_教材教辅考试_孔网...
  11. 龙芯rtc时间关机重启后不能保存问题分析
  12. linux挂载与卸载图文解析
  13. 云服务器运维管理面板有哪些?
  14. 手心输入法导致 Navicat for MySQL闪退的解决办法
  15. 汽车电工及电子技术基础【3】
  16. 密码学基础(数学理论)
  17. linux中的manifest的作用,Linux之puppet
  18. 程序员必备的软技能-金字塔原理拆解(下)
  19. 【转】String求求你别秀了
  20. 微信图片去除马赛克_朋友圈分享技巧 如何快速地截图打马赛克?

热门文章

  1. 扩展方法如何工作,为什么不需要新的CLR?
  2. 委托与事件 信用卡还款
  3. 博科光纤交换机初始密码
  4. 亚马逊上如何和卖家沟通
  5. Nacos集群CP架构底层Raft分布式一致性协议实现
  6. kali-ARP欺骗
  7. 【干货】2020各大MCN机构和媒体平台刊例
  8. mysql_assoc函数_PHP函数返回mysql_fetch_assoc()结果基于索引的数组?
  9. 2022年6月 CET6
  10. 带有备忘录的递归算法