设计模式-Builder模式
目录
- 一个例子(做汤)
- 人工做汤
- 机器做汤(使用Builder模式)
- 优缺点
- 优点
- 缺点
Builder模式属于创建型模式。
它是将一个复杂对象的构建过程隐藏起来,让使用者只关系自己要生成什么样的对象。即创建和表示分离。
一个例子(做汤)
我需要做两种汤:小鸡炖蘑菇汤和海带排骨汤。
做汤工序如下:
海带排骨汤:
- 加入海带;
- 加入排骨;
- 加入海带排骨精粉;
- 煮汤;
小鸡炖蘑菇:
- 加入小鸡儿;
- 加入蘑菇;
- 加入小鸡炖蘑菇精粉;
- 煮汤;
声明“汤”对象:
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模式相关推荐
- 设计模式--builder 模式
设计模式–builder 模式 说明 @author JellyfishMIX - github / blog.jellyfishmix.com LICENSE GPL-2.0 本文默认已经知道了 b ...
- Java设计模式——Builder模式
前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...
- 设计模式 —— Builder 模式
文章目录 1 Builder 模式的核心思想 2 第一种 Builder 模式 3 第一种模式的困惑 4 第二种 Builder 模式 5 第二种 Builder 模式见解 6 参考 1 Builde ...
- Java 常用设计模式 -- Builder模式
Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...
- java的设计模式 - Builder模式
Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...
- GOF 设计模式 builder模式笔记
Builder(生成器) 意图:将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示. 在以下情况使用Builder模式 当创建复杂的对象应该独立于该对象的组成部分以及它们的装配 ...
- Java设计模式-Builder模式
Builder模式是将一个复杂对象的创建和表示分离,使同样的创建过程可以创建不同的表示.它属于建造类模式. 一般来说,如果一个对象的创建比较复杂,超出了构造方法所能包含的范围,就可以使用工厂模式和Bu ...
- 设计模式 builder模式
也是属于对象创建类模式.使用的一般情况是,需要完成一个复杂的对象创建工作,工作通常由各个部分的子对象用一定的算法构成,比如step1,step2,step3,步骤内部常常发生剧烈的变化,但是组合在一起 ...
- 设计模式-Builder模式(构建者模式)
目录 构建者模式是什么? 为什么要用构建者模式? 构建者模式是什么? 简单来说,就是用于组装具有复杂结构的实例的模式. 什么意思呢?先来看个例子,比如现在有一个类TextBuilder用来创建一个文本 ...
最新文章
- 虚拟光驱xp版32位_001只有200M的WIN732位的系统复活你的老爷机
- 个人的关于c++运算符重载的总结
- ElasticSearch入门系列(三)文档,索引,搜索和聚合
- nyoj 寻找最大数
- Sublime优美设置(待续)
- DNS解释问题:java.net.UnknownHostException
- 如何把 Google adsense 的广告放到博客的Banner位置
- Linux网络编程——原始套接字编程
- 使用SharePoint Designer,将左侧的导航修改为Treeview
- 杭电 3400 Line belt 解题报告
- Tushare使用分享
- 电商行业用户画像分析案例
- 怀旧服服务器物品栏在哪里,魔兽世界怀旧服:祈福服务器的真实情况,装备不贵,玩家确实不多...
- 【经验贴】Java搭建一个以yy直播为主的直播聊天室
- html5头部区域标签,HTML5语义标签(header、section、footer)
- MediaWiki搭建指导
- Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...'
- Python备份Mysql脚本_python备份mysql脚本
- 色色教你玩魔方(傻瓜式全程图解教学)
- c语言中girth的作用,C++初级问题,急救中!!!
热门文章
- solr的认识、linux下安装、java下使用(含下载资源)
- vue keep-alive解决关闭标签动态缓存问题
- [POJ 2329] Nearest number-2
- oracle数据库数据导入导出步骤(入门)
- iOS -数据库网络之xml解析之远程解析XML
- Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决...
- 一些非常实用的JSON 教程
- VS 2010 Beta2中WPF与Silverlight的关键区别?
- NYOJ 469 擅长排列的小明 II (dp问题)
- 双绞线网线的连接方式