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. Masonry布局框架的使用

    Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读性.比我们使用自动布局,繁琐的约束条件,好用多了.下面我们来学学masonry的使用方 ...

  2. APP被苹果APPStore拒绝的各种原因 分类: ios相关 app相关 2015-06-25 17:27 200人阅读 评论(0) 收藏

    APP被苹果APPStore拒绝的各种原因 1.程序有重大bug,程序不能启动,或者中途退出. 2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币. 3.游戏里有实物奖励的话,一定要说清楚,奖励 ...

  3. 【转】我是怎么找到电子书的 – IT篇

    多读书,提高自己 电子出版物 IT-ebooks http://it-ebooks.info/ 上万本英文原版电子书,大多数为apress和o'relly的.全都是文字版,体积小又清楚.适合懂英文的人 ...

  4. 单纯觉得是篇好文——跨终端Web之Hybrid App

    [reference]http://www.infoq.com/cn/articles/hybrid-app#theCommentsSection 编者按:InfoQ开设新栏目“品味书香”,精选技术书 ...

  5. 【贪心】【堆】Gym -100956D - Greedy Game

    题意:给定n个物品,每个物品对于A和B来说具有不同的价值,记为ai,bi,两人交替取,A先手,A总是贪心地取当前剩下的物品中,对于他价值最高的,如果有多个,则任取一个.问B在最坏情况下,能取到的物品的 ...

  6. 4、安卓数据存储——sqlite

    朋友圈里的每一个消息体里面的数据,当下拉刷新从服务器下载数据包后,存入sqlite:用户名.图片url.点赞.评论等等.上拉加载的时候,从数据库里取出最近的5条数据加载到朋友圈上. Android通过 ...

  7. java中常用的空判断

    Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: 比较字 ...

  8. cf747 D. Winter Is Coming

    天呢,这个题2333333,真是被各种卡.完蛋完蛋完蛋.IQ------------: #include<bits/stdc++.h> #define lowbit(x) x&(- ...

  9. 部署statspack工具(二)之解决方案2

    解决方案二:在emp2的empno列上面创建索引,再执行share_pool_sql_1.sh脚本,查看sp报告 8.1在emp2的empno列上创建索引 sys@TESTDB12>create ...

  10. ORA-02266: 表中的唯一/主键被启用的外键引用

    http://www.cnblogs.com/cici-new/archive/2013/01/01/2841700.html 需要如下操作 先取消子表外键的外键约束,之后删除父表数据,最后再次启用外 ...