(@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 ...
随机推荐
- iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)
iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到 ...
- 企业证书APP发布流程
企业发布app的 过程比app store 发布的简单多了,没那么多的要求,哈 但是整个工程的要求还是一样,比如各种像素的icon啊 命名规范啊等等. 下面是具体的流程 1.修改你的 bundle i ...
- JQuery基础知识(2)
JQuery基础知识(2) JQuery滑动效果 1. JQuery slideDown(); 语法: $(selector).slideDown(speed,callback); 可选的 speed ...
- 如何开发一个微信小程序
一.概述 特点:对商家来说,小程序的开发成本低(有丰富的组件.api等).运营成本低(有数据日志等).稳定.互动流畅,便于分享.传播(基本微信平台的大量用户).对用户来说,扫码即可获取服务,随 ...
- eclipse中集成svn maven开发手册---创建提分支
开发时,需要拉取分支进行修改等操作 右键项目,选择team->分支/标记 输入创建分支地址 注意: 1,创建分支路径时,最后一层文件名称为项目的名称 2,点击浏览按钮可能会出现无法选择,且ecl ...
- 【腾讯优测干货分享】微信小程序之自动化亲密接触
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/HcPakz5CV1SHnu-U8n85pw 导语 山雨欲来风满楼,最 ...
- OSG世界坐标转屏幕坐标(转载)
OSG世界坐标转屏幕坐标 #define M(row,col) m[col * 4 + row] void Transform_Point(double out[4], const double m[ ...
- var d = document.getElementById 错误
var d = document.getElementById; var s = d("demo").innerHTML; alert(s); // IE 没有问题,其他浏览器必须 ...
- Bonferroni校正法
Bonferroni校正:如果在同一数据集上同时检验n个独立的假设,那么用于每一假设的统计显著水平,应为仅检验一个假设时的显著水平的1/n http://baike.baidu.com/view/12 ...
- JS 响应式编程
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <script ...