七、Builder 建造器模式
建造者模式(Builder): 使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,提供一种创建对象的最佳方式。
应用:
比如坑德基的汉堡、薯条、可乐、鸡翅是不变的,但是套餐是经常变化的
Java 中的 StringBuilder
如何使用: 一些基本部件不变,而其组合经常变化
与工厂模式的不同:建造者关注零件的组装过程,而工厂方法模式更关注零件的创建过程
建造者组成: 产品、抽象建造者、具体建造者、指挥者 4 个要素组成
例如:
【产品】装修一套房子:沙发、灯、浴室、地板
【指挥者】 Leader 指挥工人装修
【具体的建造者】工人
public class Room { //沙发
private String sofa;
//灯
private String light;
//浴室
private String bashroom;
//地板
private String floor; public String getSofa() {
return sofa;
} public void setSofa(String sofa) {
this.sofa = sofa;
} public String getLight() {
return light;
} public void setLight(String light) {
this.light = light;
} public String getBashroom() {
return bashroom;
} public void setBashroom(String bashroom) {
this.bashroom = bashroom;
} public String getFloor() {
return floor;
} public void setFloor(String floor) {
this.floor = floor;
} @Override
public String toString() {
return "Room{" +
"sofa='" + sofa + '\'' +
", light='" + light + '\'' +
", bashroom='" + bashroom + '\'' +
", floor='" + floor + '\'' +
'}';
}
}
public abstract class Builder { //计划装修房子
protected Room room = new Room();
public abstract void buildSofa();
public abstract void buildLight();
public abstract void buildBashRoom();
public abstract void buildFloor(); public Room getResult(){
return room;
} }
public class WorkerBuilder extends Builder{
@Override
public void buildSofa() {
room.setSofa("香港皇家沙发");
System.out.println("装修:香港皇家沙发");
} @Override
public void buildLight() {
room.setLight("德州进口灯");
System.out.println("装修:德州进口灯");
} @Override
public void buildBashRoom() {
room.setBashroom("伊丽莎白同款浴室");
System.out.println("装修:伊丽莎白同款浴室");
} @Override
public void buildFloor() {
room.setFloor("天空绚烂地板");
System.out.println("装修:天空绚烂地板");
}
}
public class Leader { protected Builder builder; public Leader(Builder builder){
this.builder = builder;
} public Room construct(){
builder.buildBashRoom();
builder.buildFloor();
builder.buildLight();
builder.buildSofa();
return builder.getResult();
}
}
public class Client {
public static void main(String []args){
Builder builder = new WorkerBuilder();
Leader leader = new Leader(builder);
Room newRoom = leader.construct();
System.out.println(newRoom);
}
}
结果:
七、Builder 建造器模式的更多相关文章
- 浅谈设计模式--建造器模式(Builder Pattern)
建造器模式,是于创建带有大量参数的对象,并避免因参数数量多而产生的一些问题(如状态不一致-JavaBean的setter模式). 如果参数多且有些是必须初始化的,有些是不一定需要初始化的时候,创建对象 ...
- 6. 星际争霸之php设计模式--建造器模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- Java设计模式之(七)——装饰器模式
1.什么是装饰器模式? Attach additional responsibilities to an object dynamically keeping the same interface.D ...
- Java设计模式:Builder(构建器)模式
概念定义 Builder模式是一步一步创建一个复杂对象的创建型模式.该模式将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来. 应用场景 对象创建过程比较复杂,或对创建顺序或组合有依 ...
- 设计模式(5)--Builder(建造模式)--创建型
1.模式定义: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品 ...
- Java设计模式(七)Decorate装饰器模式
一.场景描述 (一)问题 系统中最初使用Crystal Report(水晶报表)工具生成报表,并将报表发送给客户端查看,此时定义一CrystalReport工具类即可完成水晶报表的生成工作. 后续报表 ...
- jvm七种垃圾收集器
JVM_七种垃圾收集器介绍 本文中的垃圾收集器研究背景为:HotSpot+JDK7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老 ...
- 设计模式(8)--Decorator--装饰器模式--结构型
1.模式定义: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.模式特点: 装饰模式能够实现动态的为对象添加功能,是从一个对象 ...
- 设计模式---领域规则模式之解析器模式(Interpreter)
前提:领域规则模式 在特定领域内,某些变化虽然频繁,但可以抽象为某种规则.这时候,结合特定领域,将问题抽象为语法规则,从而给出该领域下的一般性解决方案. 典型模式 解析器模式:Interpreter ...
随机推荐
- 27.Docker集群部署
对于scrapy的部署方式 1.Scrapyd 安装扩展组件,远程控制scrapy任务,包括部署源代码,启动任务,监听任务.scrapy-client .scrapyd api 协助完成部署和监听操作 ...
- 36纯 CSS 动画原理,在页面上表现日蚀现象
原文地址:https://segmentfault.com/a/1190000015070543 感想: 动画,背景颜色 HTML code: <div class="sky" ...
- 《算法》第五章部分程序 part 5
▶ 书中第五章部分程序,包括在加上自己补充的代码,Knuth-Morris-Pratt 无回溯匹配,Boyer - Moore 无回溯匹配,Rabin - Karp 指纹匹配 ● Knuth-Morr ...
- java json字符串与对象转换
下载引入包gson-2.0.jar 1.字符转数据 final Map map = new HashMap();map.put("contents", "[{\&q ...
- NRF51822之FICR
uint32_t deviceID[2];union{ uint32_t DW; uint8_t B[4];} device_ID;//read device ID deviceID ...
- linux 源码编译php的参数
./configure --prefix=/usr/local/php-5.3.5 --with-config-file-path=/usr/local/php-5.3.5/etc --with-co ...
- (转载)Android下Affinities和Task
源文链接:http://appmem.com/archives/405 1.Activity和Task task就好像是能包含很多activity的栈. 默认情况下,一个activity启动另外一个a ...
- virtualBox下Centos系统扩展LVM磁盘空间
工具准备:下载Gparted Live CD,一个分区管理工具(根据安装的32,64位版本选择对应链接).https://sourceforge.net/projects/gparted/files/ ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql/mysql.sock' (2)
[root@XXX ~]# mysql -h localhost -uroot -p Enter password: ERROR (HY000): Can't connect to local MyS ...
- python 读取文件
python 一次读取多行 with open(filename, "r") as f: lines = f.readlines(LINE_BATCH) while lines: ...