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)设计模式学习——建造者模式的更多相关文章

  1. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  2. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  3. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  4. java的23种设计模式之建造者模式

    场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...

  5. python设计模式之建造者模式

    python设计模式之建造者模式 ​ 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...

  6. C#设计模式(5)——建造者模式(Builder Pattern)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

  7. 设计模式学习--复合模式(Compound Pattern)

    设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...

  8. C++设计模式之建造者模式(三)

    4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...

  9. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

随机推荐

  1. IM 融云 之 安装cocoapods 安装 SDK

    1. podfile 内容如下: platform :ios, '7.0' pod 'RongCloudIMKitWithVoip', '2.4.3' 现在最新是2.4.3 导入之后,就直接可以用了. ...

  2. eclipse使用egit提交代码报错

    在eclipse上使用插件egit同步代码时出现如下错误 解决办法: 开eclipse中的windows-->Preferences-->Team-->Git-->Config ...

  3. 使用PHPMailer发送带附件并支持HTML内容的邮件

    PHPMailer是一个封装好的PHP邮件发送类,支持发送HTML内容的电子邮件,以及可以添加附件发送,并不像PHP本身mail()函数需要服务器环境支持,您只需要设置邮件服务器以相关信息就能实现邮件 ...

  4. Selenium2(java)selenium常用API 六

    selenium处理HTML5 处理Vedio WebDriver driver = new FirefoxDriver(); driver.get("http://videojs.com/ ...

  5. systemd-journal[825]: Forwarding to syslog missed 99 messages

    In this particular case we have a DNS server running Bind which is logging all DNS queries. 7124 mes ...

  6. ThinkPHP创建应用的一般开发流程

    使用ThinkPHP创建应用的一般开发流程是: 系统设计.创建数据库和数据表:(可选) 项目命名并创建项目入口文件,开启调试模式: 完成项目配置: 创建项目函数库:(可选) 开发项目需要的扩展(模式. ...

  7. win32 安装 xcache扩展

    今天整了一上午,才整明白. 我的系统是是 win7 32位 ,用的环境是 Wamp,php版本是5.3.5,后来在http://xcache.lighttpd.net/pub/Releases/3.0 ...

  8. qlv格式转换成MP4格式

    腾讯视频下载:1.先下载腾讯的客户端--->播放视频在客户端 2.播放视频一段后停止 3.点击腾讯客户端的右上角的设置 4.复制缓存地址(注意:在此之前需要设置"显示隐藏的文件夹&qu ...

  9. Target runtime Apache Tomcat v8.0 is not defined.

    Target runtime Apache Tomcat v8.0 is not defined. Window-Preference-MyEclipse-Targeted Runtimes,选择存在 ...

  10. python中关于元组的操作

    元组的基本操作:1.创建一个元组: tuple=(1,26); tuple1=(","sy"); 创建一个空元组: tuple=(); 元组中只包含一个元素时,需要在元素 ...