定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。

和工厂模式的区别

  1. 工厂模式注重的对象创建的结果,而创建者模式注重的对象创建的过程。
  2. 与抽象工厂模式相比, 建造者模式返回一个组装好的完整产品 ,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
  3. 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
  4. 如果将抽象工厂模式看成汽车配件生产工厂 ,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂 ,通过对部件的组装可以返回一辆完整的汽车。

UML

优点

  • 在创建者模式中,客户端不再负责对象的创建与组装,而是把这个对象创建的责任交给其具体的创建者类,把组装的责任交给组装类,客户端只负责对象的调用,从而明确了各个类的职责。

缺点

  • 虽然利用创建者模式可以创建出不同类型的产品,但是如果产品之间的差异巨大,则需要编写多个创建者类才能实现,如果这是结合工厂模式更好。

应用场景

  1. 需要生成的产品对象有复杂的内部结构。
  2. 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
  3. 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到。

示例

通过创建者创建房子。

Java

 import java.util.ArrayList;

 public class Main
{
public static void main(String[] args)
{
Director director=new Director(); Builder chineseBuilder=new ChineseBuilder();
director.construct(chineseBuilder);
House chineseHouse=chineseBuilder.GetHouse();
chineseHouse.show(); Builder englandBuilder=new EnglandBuilder();
director.construct(englandBuilder);
House englandHouse=englandBuilder.GetHouse();
englandHouse.show();
} /**
* 抽象建造者
*/
public static abstract class Builder
{
public abstract void BuildDoor();
public abstract void BuildWall();
public abstract void BuildWindows();
public abstract void BuildHouseCeiling();
public abstract House GetHouse();
} /**
* 进行建造的产品
*/
public static class House
{
private ArrayList<String> parts = new ArrayList<String>(); public void add(String str)
{
parts.add(str);
} public void show()
{
for(String part : parts)
{
System.out.println(part);
}
System.out.println("");
}
} /**
* 导演类
*/
public static class Director
{
public void construct(Builder builder)
{
builder.BuildDoor();
builder.BuildWall();
builder.BuildWindows();
builder.BuildHouseCeiling();
}
} /**
* 具体类型的建造者
*/
public static class ChineseBuilder extends Builder
{
private House chineseHouse = new House(); public void BuildDoor()
{
chineseHouse.add("ChineseDoor");
} public void BuildWall()
{
chineseHouse.add("ChineseWall");
} public void BuildWindows()
{
chineseHouse.add("ChineseWindows");
} public void BuildHouseCeiling()
{
chineseHouse.add("ChineseHouserCeiling");
} public House GetHouse()
{
return chineseHouse;
}
} /**
* 具体类型的建造者
*/
public static class EnglandBuilder extends Builder
{
private House englandHouse = new House(); public void BuildDoor()
{
englandHouse.add("EnglandDoor");
} public void BuildWall()
{
englandHouse.add("EnglandWall");
} public void BuildWindows()
{
englandHouse.add("EnglandWindows");
} public void BuildHouseCeiling()
{
englandHouse.add("EnglandHouserCeiling");
} public House GetHouse()
{
return englandHouse;
}
}
}

创建类模式(三):创建者(Builder)的更多相关文章

  1. 设计模式之创建类模式大PK

                                        创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...

  2. ZT 创建类模式总结篇

    创建类模式总结篇 分类: 设计模式 2012-03-26 09:03 7320人阅读 评论(11) 收藏 举报 编程优化设计模式任务 创建类模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户 ...

  3. 创建类模式大PK(总结)

    创建类模式包含工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,它们都可以提供对象的创建和管理职责.当中的单例模式和原型模式很easy理解,单例模式是要保持在内存中仅仅有一个对象,原型模式是 ...

  4. 设计模式之创建类模式PK

    创建类模式包括: 工厂方法模式 建造者模式 抽象工厂模式 单例模式 原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型 ...

  5. 创建型模式(三) 抽象工厂模式(Abstract Factory)

    一.动机(Motivation) 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 如何应对这种变化?如何绕过常规的对象创建方法(ne ...

  6. 创建类模式(零):简单/静态工厂(Static Factory)

    定义 简单工厂模式属于创建型模式,但不属于23种GOF设计模式之一,这也是为什么该模式标记为零的原因.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的 ...

  7. 创建类模式(五):单例(Singleton)

    定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式一般情况下通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化. 和静态变量的区别 虽然 ...

  8. 创建类模式(四):原型(Prototype)

    定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建 ...

  9. 创建类模式(二):抽象工厂(Abstract Factory)

    定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式. ...

随机推荐

  1. 查看tablespace实际使用量和剩余空间

    到某表空间所有段的加和值,即按表空间分组统计dba_data_files.bytes-dba_free_space.bytes=dba_segments.bytesdba_segments中可查询已分 ...

  2. Android 快速开发框架XUtils

    转载自:http://www.apkbus.com/forum.php?mod=viewthread&tid=241060&highlight=xUtils 最近搜了一些框架供初学者学 ...

  3. android 应用页面与数据申请逻辑剥离;

    1.页面与数据申请剥离,数据申请框架可以灵活更换,解耦合: 2.对应页面的数据申请类中,将返回数据解析剥离,灵活更换数据返回及对应解析: 二.模块划分: 1.一些通用的工具类,可以考虑迁移到com.c ...

  4. hdu 1175(广搜)

    题意:容易理解... 思路:我开始的思路不好实现,而且有漏洞,时间复杂度也高,后来在网上学了下别人的方法,真心感觉很牛B,不仅代码好实现,而且时间复杂度比较低,具体看代码实现吧!! 代码实现: #in ...

  5. Android之APK文件签名——keytool和jarsigner

    一.生成密钥库将位置定位在jdk的bin文件中,输入以下命名行:keytool -genkey -alias ChangeBackgroundWidget.keystore -keyalg RSA - ...

  6. java jvm学习笔记十一(访问控制器)

     欢迎装载请说明出处: http://blog.csdn.net/yfqnihao/article/details/8271665 这一节,我们要学习的是访问控制器,在阅读本节之前,如果没有前面几节的 ...

  7. JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码

    本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...

  8. HDU5045-Contest(状压dp)

    题意: 有n个学生,m道题,给出每个同学解出m个问题的概率,在解题过程中每个学生的解题数的差不大于1,求最大能解出题目数的期望 分析: n很小,知道用状压,但是比赛没做出来(脑子太死了,有一个限制条件 ...

  9. POJ 2728 Desert King 01分数规划,最优比率生成树

    一个完全图,每两个点之间的cost是海拔差距的绝对值,长度是平面欧式距离, 让你找到一棵生成树,使得树边的的cost的和/距离的和,比例最小 然后就是最优比例生成树,也就是01规划裸题 看这一发:ht ...

  10. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 page_should_contain_list(self, locator, message='', loglevel='INFO')

    def page_should_contain_list(self, locator, message='', loglevel='INFO'): """Verifies ...