假设要组装一辆自行车,并且自行车就是车轮和车架组成。

Builder对应于组装自行车所使用的车轮和车架

ConcreteBuiler对应于自行车的车轮和车架,同时可以返回一辆自行车。

Product对应于自行车。

Director表示组装过程。

此时我们再来理解下面这句话:“在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。”

自行车就是“一个复杂对象”,它有车轮和车架组成,但不管车轮和车架这两个部件怎么变化,生产一辆自行车的过程是不会变的,即组装过程是不会变的。

下面是java示例代码:

/**
* A bike as a concrete product we got finally
*
*/
public class Bike {
//自行车车架数量
int frameNumber;
//自行车轮子数量
int wheelNumber;
public Bike(){
frameNumber = 1;
wheelNumber = 4;
}
public int getFrameNumber() {
return frameNumber;
} public int getWheelNumber() {
return wheelNumber;
} }
/**
*
* An abstract Builder
*/
public abstract class BikeBuilder {
//构建bike的框架
public abstract void BuildFrame(int frameNumber);
//构建bike的轮子
public abstract void BuildWheels(int wheelNumber);
//获取构建好的完整的产品
public abstract Bike getBike();
}
/**
*
*构建自行车的各个部件
*/
public class ConcreteBikeBuilder extends BikeBuilder {
Bike bike;
public ConcreteBikeBuilder(){
bike = new Bike();
}
@Override
public void BuildFrame(int frameNumber) {
bike.frameNumber = frameNumber;
} @Override
public void BuildWheels(int wheelNumber) {
bike.wheelNumber = wheelNumber;
} @Override
public Bike getBike() { return bike;
} }
/**
*
*组装自行车
*/
public class BikeDirector {
public void createBike(BikeBuilder concreteBuilder){
concreteBuilder.BuildFrame(1);
concreteBuilder.BuildWheels(4);
}
}
public class TestClient {

	public static void main(String[] args) {
Bike bike = new Bike();
BikeBuilder builder = new ConcreteBikeBuilder();
BikeDirector director = new BikeDirector();
director.createBike(builder);
bike = builder.getBike();
System.out.println("车架frame:" + bike.getFrameNumber()+"个");
System.out.println("轮子wheel:" + bike.getWheelNumber()+"个");
}
}

测试结果:

车架frame:1个
轮子wheel:4个

四、优点和缺点

优点如下:

1、将一个复杂对象的创建过程封装起来。

2、解耦了组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。--上面对自行车的分析可以很清楚的看出这点。

3、向客户隐藏产品内部的表现。

4、产品的实现可以被替换,因为客户只看到一个抽象的接口。

缺点如下:

1、经常被用来创建组合结构。

五、适用性

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

六、实现要点

1、建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。

2、产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。 3、创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以,但是这也不是绝对的,特别是类似文本转换这种情况下,缺省的方法将输入原封不动的输出是合理的缺省操作。

4、前面我们说过的抽象工厂模式(AbtractFactory)解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化,建造者模式常和组合模式(Composite Pattern)结合使用。

设计模式之生成者模式java源代码的更多相关文章

  1. 设计模式之职责链模式(JAVA实现)

    学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...

  2. 设计模式之装饰者模式-java实例

    设计模式之装饰者模式 需求场景 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式. 我们已经有了产品,而且这个产品的功能非常 ...

  3. 设计模式之责任链模式——Java语言描述

    责任链模式为请求创建了一个接受者对象的链.这种模式给予请求的类型,对请求的发送者和接受者进行解耦.这种类型的设计模式属于行为模式.在这种模式下,通常每个接收者都包含对另一个接收者的引用.如果一个对象不 ...

  4. 《Java设计模式》之代理模式 -Java动态代理(InvocationHandler) -简单实现

    如题 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式可细分为如下, 本文不做多余解释 远程代理 虚拟代理 缓冲代理 保护代理 借鉴文章 ht ...

  5. 设计模式之适配者模式——Java语言描述 | Amos H's blog

    适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模糊属于结构性模式,它结合了两个独立接口的功能 概念阐述 使用适配器模式可以解决在软件系统中,将一些旧的类放入新环境中,但是新环境要求的接口旧 ...

  6. 设计模式之抽象工厂模式(Java实现)

    “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说完,摸了摸跪的发疼的膝盖,咳咳,我发四我没笑!真 ...

  7. 设计模式之工厂方法模式(Java实现)

    “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~).“抽象工厂模式,赶紧的自我介绍,工厂方法模式 ...

  8. 设计模式—三种工厂模式(JAVA)

    一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻 ...

  9. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

随机推荐

  1. ./configure: error: the HTTP rewrite module requires the PCRE library解决

    ./configure: error: the HTTP rewrite module requires the PCRE library解决   有时候,我们需要单独安装nginx,来处理大量的下载 ...

  2. Avalon Framework

    Apache Avalon has closed. Apache Avalon began in 1999 as the Java Apache Server Framework and in lat ...

  3. tf.trainable_variables()

    https://blog.csdn.net/shwan_ma/article/details/78879620 一般来说,打印tensorflow变量的函数有两个:tf.trainable_varia ...

  4. MongoDB之Array Object的特殊操作

    相比关系型数据库,Array[1,2,3,4,5]和Object{'name':'Wjs'}是MongoDB比较特殊的类型 db.Wjs.insert({"name":" ...

  5. 94. Binary Tree Inorder Traversal(Tree, stack)

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  6. Python词云(词频统计,掩膜显示)

    Python2.7 anaconda.安装Wordcloud,网上有许多下载路径,说一下掩模,就是在这个膜的区域才会有东西,当然这个与实际的掩模还有一定区别,这个词频显示是把所有统计的词,显示在这个掩 ...

  7. swift - 接入听云监测 - 问题

    1. 正常下载  探针SDK:https://report.tingyun.com/mobile-web/#/onlyHeader/sdkDownload 2.按步骤接入 ,添加库啊,什么的URLSc ...

  8. ApplicationContextAware的使用

    一.这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以 ...

  9. avalon 双向绑定在新版chrome中不能同步中文输入

    1>1.x和2.x都有这样的问题,输入中文无法同步到VM,演示地址 http://codepen.io/roscoe054/pen/XXKYMj?editors=1111 chrome 版本 5 ...

  10. 金老师的经典著作《一个普通IT人的十年回顾》

    学习人生             -------一个普通IT人的十年回顾(上)序从1994到2003,不知不觉之间,我已在计算机技术的世界里沉浸了十年.有位哲人说过:如果一个人能用十年的时间专心致志地 ...