一. 模式结构

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

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

二. 模式实现

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

  1. Meal.java  套餐类,Product角色

  1. public class Meal {
  2. private String food;
  3. private String drink;
  4.  
  5. public String getFood() {
  6. return food;
  7. }
  8.  
  9. public void setFood(String food) {
  10. this.food = food;
  11. }
  12.  
  13. public String getDrink() {
  14. return drink;
  15. }
  16.  
  17. public void setDrink(String drink) {
  18. this.drink = drink;
  19. }
  20. }

  2. MealBuilder.java  套餐构造器,Builder角色

  1. public abstract class MealBuilder {
  2. Meal meal = new Meal();
  3.  
  4. public abstract void buildFood();
  5.  
  6. public abstract void buildDrink();
  7.  
  8. public Meal getMeal(){
  9. return meal;
  10. }
  11. }

  3. 套餐A、套餐B  实现抽象套餐类,ConcreteBuilder角色

  1. public class MealA extends MealBuilder{
  2.  
  3. public void buildDrink() {
  4. meal.setDrink("一杯可乐");
  5. }
  6.  
  7. public void buildFood() {
  8. meal.setFood("一盒薯条");
  9. }
  10.  
  11. }
  12.  
  13. public class MealB extends MealBuilder{
  14.  
  15. public void buildDrink() {
  16. meal.setDrink("一杯柠檬果汁");
  17. }
  18.  
  19. public void buildFood() {
  20. meal.setFood("三个鸡翅");
  21. }
  22.  
  23. }

  4. KFC的服务员  它决定了套餐是的实现过程,然后给你一个完美的套餐,Director角色

  1. public class KFCWaiter {
  2. private MealBuilder mealBuilder;
  3.  
  4. public void setMealBuilder(MealBuilder mealBuilder) {
  5. this.mealBuilder = mealBuilder;
  6. }
  7.  
  8. public Meal construct(){
  9. //准备食物
  10. mealBuilder.buildFood();
  11. //准备饮料
  12. mealBuilder.buildDrink();
  13.  
  14. //准备完毕,返回一个完整的套餐给客户
  15. return mealBuilder.getMeal();
  16. }
  17. }

  

三. 测试 

  1. public class Client {
  2. public static void main(String[] args) {
  3. //服务员
  4. KFCWaiter waiter = new KFCWaiter();
  5. //套餐A
  6. MealA a = new MealA();
  7. //服务员准备套餐A
  8. waiter.setMealBuilder(a);
  9. //获得套餐
  10. Meal mealA = waiter.construct();
  11.  
  12. System.out.print("套餐A的组成部分:");
  13. System.out.println(mealA.getFood()+"---"+mealA.getDrink());
  14. }
  15. }

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

四. 模式总结

  1. 1. 建造者模式是将一个复杂对象的创建过程给封装起来,客户只需要知道可以利用对象名或者类型就能够得到一个完整的对象实例,而不需要关心对象的具体创建过程。
  2. 2. 建造者模式将对象的创建过程与对象本身隔离开了,使得细节依赖于抽象,符合依赖倒置原则。可以使用相同的创建过程来创建不同的产品对象。

Java开发中常用的设计模式(三)---建造者模式的更多相关文章

  1. Java开发中常用的设计模式(一)---工厂模式

    一. 准备工作 1. 本文参考自  自己理解的工厂模式,希望对大家有所帮助 二. 开始 以汽车工厂为例,首先有个汽车类的接口 Car,里面有个开车的方法 drive(),然后有个宝马车的类 BMW 和 ...

  2. Java开发中常用的设计模式(二)---单例模式

    一. 懒汉式单例 //懒汉式单例类.在第一次调用的时候实例化自己 public class Singleton { private Singleton() {} private static Sing ...

  3. Java开发中常用jar包整理及使用

    本文整理了我自己在Java开发中常用的jar包以及常用的API记录. <!-- https://mvnrepository.com/artifact/org.apache.commons/com ...

  4. 从ES6重新认识JavaScript设计模式(三): 建造者模式

    1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...

  5. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  6. iOS开发中常用的设计模式

    常用的设计模式(一)代理模式应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过 ...

  7. ios项目总结一:开发中常用的设计模式

    一.单例设计模式 1.应用场景: 程序运行期间,在内存中只有一个实例存在,主要用于资源共享,对硬件的访问等等 2.优点: 跨模块,解耦合,使用简单 3.敏捷原则: 单一职责原则 4.SDK实例: UI ...

  8. Java 开发中常用的网站地址

    博客地址:http://www.moonxy.com 一.前言 在日常的开发中,通常需要访问或者设置不同的网站来获取需要的数据,不如我们都知道 Linux 系统版本比较多(例如:Ubuntu.Cent ...

  9. Android开发中常用的设计模式

    首先需要说明的是,这篇博文灵感来自于 http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121547.html ,在这里,博主已经很 ...

随机推荐

  1. 三个分段的.tar.gz文件,合并并解压

    1.合并使用spilt分割的文件 # cat sxrt5.0.dvd1.tar.gzaa sxrt5.0.dvd1.tar.gzab sxrt5.0.dvd1.tar.gzac >>sxr ...

  2. bzoj4519: [Cqoi2016]不同的最小割(最小割树)

    传送门 好神仙……最小割树是个什么东西…… 其实我觉得干脆直接$O(n^2)$跑几个dinic算了…… 来说一下这个叫最小割树的神奇东西 我们先建一个$n$个点,没有边的无向图 在原图中任选两点$s, ...

  3. docker容器的基本操作

    docker容器是独立运行的一个或一组应用,以及它们的运行态环境.下面具体介绍如何管理一个容器,包括容器的创建,启动和停止等. 启动容器 基于镜像新建一个容器并启动 将终止状态的容器重新启动 新建并启 ...

  4. maven项目发布到tomcat后没有lib目录解决方案

    maven项目放入tomcat中时,总是报错,而且这些jar都是真实存在的,错误如下: maven eclipse tomcat java.lang.ClassNotFoundException: o ...

  5. 【xsy1058】 单词 乱搞

    题目大意:给你$n$个长度为$m$的字符串,字符集仅为{x,y,z}三个字符,定义两个字符串$(s_i,s_j)$的相似度为$\sum_{k=1}^{m} [s_i[k]==s_j[k]]$. 从$0 ...

  6. U8API——向U8数据库表导入数据

    一.打开API资源管理器 替换两个引用 打开应用实例,选择相应的功能 复制相应的封装类到自己的目录下 在数据库新建临时表,与目标表相同 数据导入: 思路:先将要导入的数据导入到与U8目标表相同的临时表 ...

  7. vba调用c#dll

    本文阐述如何用C#创建COM组件,并能用VB6.0等调用.附有完整测试通过的代码.该功能总体看来很简单,实际值得注意的地方还是挺多.因为很少有人写这类文章,有些代码也是转来转去的不全,有些甚至让人误入 ...

  8. sql server 只读帐号设置能读取存储过程,view等内容。

    如果设定了某个帐号是只读权限,是无法查看存储过程的,比如你用 sp_helptext '存储过程名' ,这样子会提示权限不足或者存储过程不存在,其实就是没权限, 要再给这个只读帐号用 sa 赋予它查看 ...

  9. 搭建Nuget.Server push时,"Failed to process request. 'Method Not Allowed'"

    环境: windows server 2012,已经安装web dev工具. nuget.server版本2.11 输入网站地址正常访问: VS也能正常添加,nuget服务,在项目打包后上传服务器时报 ...

  10. 搭建互联网架构学习--003--maven以及nexus私服搭建

    跳过,等待完善中,,, 后台服务工具maven:使用Nexus配置Maven私有仓库 一.安装配置Nexus 1. 下载nexus https://www.sonatype.com/download- ...