目录

  • 一个例子(做汤)
  • 人工做汤
  • 机器做汤(使用Builder模式)
  • 优缺点
    • 优点
    • 缺点

Builder模式属于创建型模式。
它是将一个复杂对象的构建过程隐藏起来,让使用者只关系自己要生成什么样的对象。即创建和表示分离。

一个例子(做汤)

我需要做两种汤:小鸡炖蘑菇汤和海带排骨汤。
做汤工序如下:

海带排骨汤:

  1. 加入海带;
  2. 加入排骨;
  3. 加入海带排骨精粉;
  4. 煮汤;

小鸡炖蘑菇:

  1. 加入小鸡儿;
  2. 加入蘑菇;
  3. 加入小鸡炖蘑菇精粉;
  4. 煮汤;

声明“汤”对象:

public class Soup {/*** 材料1*/private String cailiao1;/*** 材料2*/private String cailiao2;/*** 材料3*/private String cailiao3;//getter/setter省略@Overridepublic String toString() {return "Soup{" +"cailiao1='" + cailiao1 + '\'' +", cailiao2='" + cailiao2 + '\'' +", cailiao3='" + cailiao3 + '\'' +'}';}
}    

人工做汤

    //人工做汤System.out.println("-----人工做汤-----");//制作小鸡炖蘑菇汤System.out.println("-----制作小鸡炖蘑菇-----");Soup xiaojimoguSoup = new Soup();xiaojimoguSoup.setCailiao1("小鸡儿");xiaojimoguSoup.setCailiao2("蘑菇");xiaojimoguSoup.setCailiao3("小鸡炖蘑菇精粉");System.out.println("小鸡炖蘑菇:"+xiaojimoguSoup);//制作海带排骨汤System.out.println("-----制作海带排骨汤-----");Soup haidaipaiguSoup = new Soup();haidaipaiguSoup.setCailiao1("海带");haidaipaiguSoup.setCailiao2("排骨");haidaipaiguSoup.setCailiao3("海带排骨精粉");System.out.println("海带排骨汤:"+haidaipaiguSoup);

可以看到做汤的时候需要添加什么材料全靠我自己去操作,这无疑是很复杂且繁琐的。

机器做汤(使用Builder模式)

现在我购买了一个做汤的==机器==,可以做各种各样的汤,这取决于你给机器选择什么样的==程序==。

做汤程序通用接口:

public interface SoupProgram {void step1();//步骤1void step2();//步骤2void step3();//步骤3Soup make();//做汤
}

做小鸡炖蘑菇的程序:

public class XiaojimoguSoupProgram implements SoupProgram {private Soup soup = new Soup();@Overridepublic void step1() {soup.setCailiao1("小鸡儿");System.out.println("加入小鸡儿");}@Overridepublic void step2() {soup.setCailiao2("蘑菇");System.out.println("加入蘑菇");}@Overridepublic void step3() {soup.setCailiao3("小鸡炖蘑菇精粉");System.out.println("加入小鸡炖蘑菇精粉");}@Overridepublic Soup make() {System.out.println("小鸡炖蘑菇汤制作好啦~");return soup;}
}

做海带排骨汤程序:

public class HaidaipaiguSoupProgram implements SoupProgram {private Soup soup = new Soup();@Overridepublic void step1() {soup.setCailiao1("海带");System.out.println("加入海带");}@Overridepublic void step2() {soup.setCailiao2("排骨");System.out.println("加入排骨");}@Overridepublic void step3() {soup.setCailiao3("海带排骨精粉");System.out.println("加入海带排骨精粉");}@Overridepublic Soup make() {System.out.println("海带排骨汤制作好啦~");return soup;}
}

做汤机器:

public class SoupMakeMachine {public static Soup builder(SoupProgram program) {program.step1();program.step2();program.step3();return program.make();}
}

现在我只需要选择使用哪个做汤程序就可以用机器来完成做汤了。

    //机器做汤System.out.println("-----机器做汤-----");//制作小鸡炖蘑菇汤System.out.println("-----制作小鸡炖蘑菇-----");SoupProgram program = new XiaojimoguSoupProgram();System.out.println("小鸡炖蘑菇:"+SoupMakeMachine.builder(program));//制作海带排骨汤System.out.println("-----制作海带排骨汤-----");SoupProgram program1 = new HaidaipaiguSoupProgram();System.out.println("海带排骨汤:"+SoupMakeMachine.builder(program1));

优缺点

优点

1.隐藏对象的创建过程,将对象创建过程和对象本身解耦,使用者只需要关心要创建什么样的东西。通过这个例子人工和机器做汤的比较,很明显能发现使用机器能方便很多。现实生活中也是如此(如工厂流水线)。

2.方便扩展。上面也提到了,机器做汤,做什么样的汤取决于选择什么样的程序,如果你想做玉米萝卜汤,那你只需要给机器植入做玉米萝卜汤的程序(即实现SoupProgram接口)。

3.遵循了“开闭原则”。对象应该对扩展开放对修改关闭。

缺点

通过上面的代码,很明显能感觉到,使用这个Builder设计模式以后引入了更多的类和接口,增加了复杂度。


你可以在这里获取相关代码:设计模式-Builder模式

转载于:https://www.cnblogs.com/xuxiaojian/p/11460397.html

设计模式-Builder模式相关推荐

  1. 设计模式--builder 模式

    设计模式–builder 模式 说明 @author JellyfishMIX - github / blog.jellyfishmix.com LICENSE GPL-2.0 本文默认已经知道了 b ...

  2. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  3. 设计模式 —— Builder 模式

    文章目录 1 Builder 模式的核心思想 2 第一种 Builder 模式 3 第一种模式的困惑 4 第二种 Builder 模式 5 第二种 Builder 模式见解 6 参考 1 Builde ...

  4. Java 常用设计模式 -- Builder模式

    Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...

  5. java的设计模式 - Builder模式

    Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...

  6. GOF 设计模式 builder模式笔记

    Builder(生成器) 意图:将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示. 在以下情况使用Builder模式 当创建复杂的对象应该独立于该对象的组成部分以及它们的装配 ...

  7. Java设计模式-Builder模式

    Builder模式是将一个复杂对象的创建和表示分离,使同样的创建过程可以创建不同的表示.它属于建造类模式. 一般来说,如果一个对象的创建比较复杂,超出了构造方法所能包含的范围,就可以使用工厂模式和Bu ...

  8. 设计模式 builder模式

    也是属于对象创建类模式.使用的一般情况是,需要完成一个复杂的对象创建工作,工作通常由各个部分的子对象用一定的算法构成,比如step1,step2,step3,步骤内部常常发生剧烈的变化,但是组合在一起 ...

  9. 设计模式-Builder模式(构建者模式)

    目录 构建者模式是什么? 为什么要用构建者模式? 构建者模式是什么? 简单来说,就是用于组装具有复杂结构的实例的模式. 什么意思呢?先来看个例子,比如现在有一个类TextBuilder用来创建一个文本 ...

最新文章

  1. 虚拟光驱xp版32位_001只有200M的WIN732位的系统复活你的老爷机
  2. 个人的关于c++运算符重载的总结
  3. ElasticSearch入门系列(三)文档,索引,搜索和聚合
  4. nyoj 寻找最大数
  5. Sublime优美设置(待续)
  6. DNS解释问题:java.net.UnknownHostException
  7. 如何把 Google adsense 的广告放到博客的Banner位置
  8. Linux网络编程——原始套接字编程
  9. 使用SharePoint Designer,将左侧的导航修改为Treeview
  10. 杭电 3400 Line belt 解题报告
  11. Tushare使用分享
  12. 电商行业用户画像分析案例
  13. 怀旧服服务器物品栏在哪里,魔兽世界怀旧服:祈福服务器的真实情况,装备不贵,玩家确实不多...
  14. 【经验贴】Java搭建一个以yy直播为主的直播聊天室
  15. html5头部区域标签,HTML5语义标签(header、section、footer)
  16. MediaWiki搭建指导
  17. Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...'
  18. Python备份Mysql脚本_python备份mysql脚本
  19. 色色教你玩魔方(傻瓜式全程图解教学)
  20. c语言中girth的作用,C++初级问题,急救中!!!

热门文章

  1. solr的认识、linux下安装、java下使用(含下载资源)
  2. vue keep-alive解决关闭标签动态缓存问题
  3. [POJ 2329] Nearest number-2
  4. oracle数据库数据导入导出步骤(入门)
  5. iOS -数据库网络之xml解析之远程解析XML
  6. Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决...
  7. 一些非常实用的JSON 教程
  8. VS 2010 Beta2中WPF与Silverlight的关键区别?
  9. NYOJ 469 擅长排列的小明 II (dp问题)
  10. 双绞线网线的连接方式