(@WhiteTaken)设计模式学习——建造者模式
Builder模式,也就是建造者模式或者生成器模式,是GoF提出的23种设计模式的一种。
这种模式是用来隐式的创建复合对象而提出来的。
创建复合对象的过程,不在主客户端显示。
下面直接上代码。以修建房屋为例子。
1.修建房屋,我们需要实例化一个房子,房子需要能修建门、地板、墙壁等。这时候我们需要有一个房子类。我们需要为其添加get set方法。
/*
* 房子 可以修建门窗、地板、墙
*/
public class House {
private String door;
private String floor;
private String wall; public String getDoor() {
return door;
}
public void setDoor(String door) {
this.door = door;
}
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
}
2.但是我们发现,我们想要修建房子,在主客户端中我们需要创建一个房子的实例,然后调用其各种set方法,创建这个房子的属性。这样确实可以修建一个简单的房子,但是房子是有不同种类的,比如平房、公寓、写字楼、住宅等等。
这样的话,我们需要用尽量简洁的代码在主客户端建造我们的房子。我们把修建房子的工作交给工程队完成,但是不同的工程队,修建的房子的类型是不同的。所以我们需要把工程队抽象成一个接口。
/*
* 房屋建造者(工程队) 修建不同的房子 ,建造者不同, 公寓、平房、商业住宅
*/
public interface HouseBuilder {
public void makeDoor();
public void makeFloor();
public void makeWall();
public House returnHouse();
}
3.能实现这个接口的类,当然就是不同的工程队啦。我们这时候可以派遣两个工程队分别完成公寓和住宅的建造任务。修建完毕需要返回修建好的住宅验收。
/*
* 修建公寓的建造者,需要实现修建门、地板、墙的方法
*/
public class GoogyuBuilder implements HouseBuilder { House house =new House();
public void makeDoor() {
house.setDoor("WhiteTaken--公寓--门");
} public void makeFloor() {
house.setFloor("WhiteTaken--公寓--地板");
} public void makeWall() {
house.setWall("WhiteTaken--公寓--墙");
} public House returnHouse(){
return house;
}
} /*
* 住宅的建造者需要修建门、地板、墙
*/
public class ZhuzhaiBuilder implements HouseBuilder { House house= new House(); public void makeDoor() {
house.setDoor("WhiteTaken--住宅--门");
} public void makeFloor() {
house.setFloor("WhiteTaken--住宅--地板");
} public void makeWall() {
house.setWall("WhiteTaken--住宅--墙");
} public House returnHouse(){
return house;
}
}
4.但是我们只有上边的这部分还不是特别完美。我们想修建不同的房子,就得去调用不同建造者的make方法。在主客户端并不是好,因为会写入重复的代码。
这是我们可以添加设计师类,设计师可以调用不同的工程队,完成不同的工作。
/*
* 设计师负责建造房子,建造不同的房子,需要不同的工程队
*/
public class HouseDirector {
public static void SetBuilder(HouseBuilder houseBuilder)
{
houseBuilder.makeDoor();
houseBuilder.makeFloor();
houseBuilder.makeWall();
}
}
5.好,这时候我们可以在主客户端建造我们的房子。
public class MainClass {
public static void main(String[] args) {
//HouseBuilder builder=new GoogyuBuilder();//公寓建造者
HouseBuilder builder=new ZhuzhaiBuilder();//住宅建造者
HouseDirector.SetBuilder(builder);//设计师让建造者建造不同的房屋
House house=builder.returnHouse();//验收房屋
System.out.println(house.getDoor());
System.out.println(house.getFloor());
System.out.println(house.getWall());
}
}
打印的结果。
1.当实例化一个公寓建造者,情况如下。

2.当实例化一个住宅建造者,情况如下。

以上打印过程,我们只需要实例化不同的建造者就可以完成。即在主客户端中我们仅仅修改了少量的代码就完成了大部分的工作。极大的提高了效率和可拓展性。
建造者模式在哪里使用?
1.对象的创建,此模式是为对象的创建而设计的模式。
2.创建一个复合对象时可以用到,且创建的过程不需要让外界知道。
3.不同的工厂对产品属性有不同的创建方法,如果建造者不同,创建的复合对象是不同的。
(@WhiteTaken)设计模式学习——建造者模式的更多相关文章
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- 【GOF23设计模式】建造者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- java的23种设计模式之建造者模式
场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...
- python设计模式之建造者模式
python设计模式之建造者模式 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...
- C#设计模式(5)——建造者模式(Builder Pattern)
一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...
- 设计模式学习--复合模式(Compound Pattern)
设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...
- C++设计模式之建造者模式(三)
4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
随机推荐
- tools_list
http://files.cnblogs.com/files/yansc/ExportQingtaoImage.rar
- STM32驱动W25X64存储器
W25X64 是华邦公司推出的大容量 SPI FLASH 产品,W25X64 的容量为 64Mbit(8M),该系列还有 W25Q80/16/32 等.W25X16,W25X32,W25X64分别有 ...
- 【转】C/CPP之static
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...
- MonkeyRecorder
http://www.cnblogs.com/lynn-li/p/5894953.html
- 让DIV的滚动条自动滚动到最底部 - 4种方法
方法一:使用锚标记要滚动到的位置,然后通过click方法模拟点击滚动到锚所在位置 <script language="javascript1.2" type="te ...
- iOS bug 之 H5 页面没有弹出提示框
描述:在安卓上有提示框,但是在iOS上没有提示框. step 1: 失误,是我没有在正确的位置设置网址. step 2: 修改之后,测试页能弹出提示框,但是正式的页面没有提示框. step 3: 我输 ...
- 笔记整理——C语言-http
C语言 HTTP GZIP数据解压 - 大烧饼的实验室 - 博客园 - Google Chrome (2013/4/10 18:22:26) C语言 HTTP GZIP数据解压 这个代码在http ...
- 使用原始XML资源——使用原始XML文件
下面为示例程序添加一个原始的XML文件,将该XML文件放到/res/xml目录下,该XML文件的内容很简单.XML资源的内容如下. 程序清单: \res\xml\books.xml文件 <?x ...
- mysql 自带的压力测试
注意mysqlslap 是mysql5.1之后新添加的功能,之前的版本是没有此功能的
- Servlet进阶API
对于每个Servlet的设置信息,web容器会为其生成一个ServletConfig作为代表对象,可以从该对象取得Servlet初始参数,以及代表整个web应用程序的ServletContext对象. ...