设计模式(十六):建造者模式

一、概述  

  建造者模式很容易让人想到建房子,不管建刚需房、改善房还是别墅,它们都离不开地基、柱子、层面和墙体这些组成部分,建筑工人就是把这些组成部分一个个建起来,最后连成一体建出一栋栋楼房。

来看看建造者模式的定义,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建房子的过程都是相似的,但可以建出形形色色的房子。

二、结构类图

三、应用实例

  我们用制造自行车为例子讲解建造者模式,自行车由车架、轮胎、脚踏等部件组成,如下图所示。自行车制造公司就是把这些零部件组装起来。

自行车制造公司的工程部门相当于指挥者,生产部门相当于建造者,当今共享单车做的比较大的摩拜和ofo相当于客户,单车就是产品了。结构图如下所示:

  一起来看看如何用代码来实现

  1、定义创建者接口,也就是生产线接口

package com.jet.pattern.builder;

import com.jet.pattern.builder.impl.Bike;

/**
 * description:
 * 自行车生产线接口
 * Created by chenzanjin on 2017/2/22.
 */
public interface BikeBuilder {
    // 组装轮胎
    public void buildTyres();
    // 组装车架
    public void buildFrame();
    // 组装GPS定位装置
    public void buildGPS();
    // 获取自行车
    public Bike getBike();
}

  2、定义摩拜单车生产线

package com.jet.pattern.builder.impl;

import com.jet.pattern.builder.BikeBuilder;

/**
 * description:
 * 摩拜单车生产线
 * Created by chenzanjin on 2017/2/22.
 */
public class MoBikeBuilder implements BikeBuilder {
    // 拥有单车对象
    Bike bike = new Bike();
    @Override
    public void buildTyres() {
        bike.setTyre("橙色轮胎");
    }

    @Override
    public void buildFrame() {
        bike.setFrame("橙色车架");
    }

    @Override
    public void buildGPS() {
        bike.setGps("mobike定制版GPS定位装置");
    }

    @Override
    public Bike getBike() {
        return bike;
    }
}

  3、定义ofo单车生产线

package com.jet.pattern.builder.impl;

import com.jet.pattern.builder.BikeBuilder;

/**
 * description:
 * ofo单车生产线
 * Created by chenzanjin on 2017/2/22.
 */
public class OfoBikeBuilder implements BikeBuilder {
    // 拥有单车对象
    Bike bike = new Bike();
    @Override
    public void buildTyres() {
        bike.setTyre("黑色轮胎");
    }

    @Override
    public void buildFrame() {
        bike.setFrame("黄色车架");
    }

    @Override
    public void buildGPS() {
        bike.setGps("ofo定制版GPS定位装置");
    }

    @Override
    public Bike getBike() {
        return bike;
    }
}

  4、定义单车对象

package com.jet.pattern.builder.impl;

/**
 * description:
 * 自行车对象
 * Created by chenzanjin on 2017/2/22.
 */
public class Bike {
    // 轮胎
    private String tyre;
    // 车架
    private String frame;
    // GPS定位装置
    private String gps;

    public String getTyre() {
        return tyre;
    }

    public void setTyre(String tyre) {
        this.tyre = tyre;
    }

    public String getFrame() {
        return frame;
    }

    public void setFrame(String frame) {
        this.frame = frame;
    }

    public String getGps() {
        return gps;
    }

    public void setGps(String gps) {
        this.gps = gps;
    }
}

  5、定义工程部

package com.jet.pattern.builder.impl;

import com.jet.pattern.builder.BikeBuilder;

/**
 * description:
 * 工程部门作为指挥者,可以指导生产部门作业
 * Created by Administrator on 2017/2/22.
 */
public class EngineeringDepartment {
    // 用户告知指挥者想要什么样的单车
    BikeBuilder bikeBuilder;
    public EngineeringDepartment(BikeBuilder bikeBuilder){
        this.bikeBuilder = bikeBuilder;
    }

    // 指导组装单车
    public void Construct(){
        bikeBuilder.buildTyres();
        bikeBuilder.buildFrame();
        bikeBuilder.buildGPS();
    }
}

  6、测试类

package com.jet.pattern.builder.impl;

import com.jet.pattern.builder.BikeBuilder;

/**
 * description:
 * 建造者测试类
 * Created by Administrator on 2017/2/22.
 */
public class Test {
    public static void main(String[] args) {
        // 建造摩拜单车
        BikeBuilder moBikeBuilder = new MoBikeBuilder();
        EngineeringDepartment ed1 = new EngineeringDepartment(moBikeBuilder);
        ed1.Construct();// 指导组装
        // 产出单车,体现建造和显示分离
        Bike moBike = moBikeBuilder.getBike();

        // 建造ofo单车
        BikeBuilder ofoBikeBuilder = new MoBikeBuilder();
        EngineeringDepartment ed2 = new EngineeringDepartment(ofoBikeBuilder);
        ed2.Construct();// 指导组装
        Bike ofoBike = ofoBikeBuilder.getBike();

    }
}

四、优缺点

  1、优点

  (1)、产品的建造和表示分离,实现了解耦。

  (2)、隐藏了产品的建造细节,用户只需关心产品的表示,而不需要了解是如何创建产品的。

  (3)、体现了开闭原则,如上代码所示,如果需要再生产其他共享单车,只需要再开一条生产线即可,不影响其他生产线的作业。

  2、缺点

  (1)、当建造者过多时,会产生很多类,难以维护。

五、总结

  建造者模式的使用场合是当创建复杂对象时,把创建对象成员和装配方法分离出来,放在建造者类中去实现,用户使用该复杂对象时,不用理会它的创建和装配过程,只关心它的表示形式。其实完全理解这个模式还是要一番思考的,难以搞懂的是指挥者似乎没什么存在的必要,在代码里也没体现它的作用,我们也可以把指挥者的方法放在建造者里面,但为什么没有这样做呢?我想这可能是考虑到单一责任原则,建造者只负责创建对象的各个部分,至于各个部分创建的顺序、装配方法它就不管了。还有就是当顺序要改变时,建造者可以不用改动,改动指挥者就好了,指挥者只有一个,建造者有很多,要改建造者就麻烦了。

时间: 2024-10-15 02:04:52

设计模式(十六):建造者模式的相关文章

从王者荣耀看设计模式(十六.建造者模式)

从王者荣耀看设计模式(建造者模式) 一.简介 为了玩王者荣耀的游戏体验感,不少玩家都会选择花钱购买自己常用英雄的皮肤.一方面,购买的皮肤通常要比原画更加"炫酷".另一方面,购买的英雄皮肤常常伴随有特殊的回城特效与攻击技能特效. 二.模式动机 不管在生活中还是软件系统中,都存在一个包含多个组成部件的复杂对象,如汽车,它包括车轮.方向盘.发动机等各种部件.组成复杂对象的这些部件之间或许还会一定的约束,若某些属性没有赋值可能无法构成完整产品使用.如,电子邮件包含地址.收件人姓名.联系方式.创

设计模式 ( 十六 ): Mediator中介者模式 -- 行为型

1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,而且对系

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择.这

设计模式学习04—建造者模式

一.动机与定义 创建对象时,我们知道可以使用工厂方式来创建,使调用者和具体实现解耦,但是有一种情况,当要创建的多个对象之间重复性较大,只有创建步骤.组装顺序或者内部构件不同时,工厂模式就需要进一步的演化了,如我们去KFC,有很多种套餐,比如套餐1(薯条+可乐+汉堡),套餐2(鸡肉卷+薯条+可乐),这个套餐就是我们要获取的复杂对象,那么程序如何创建出这种对象呢. 我们看到套餐的内容很多是一样的,那么我们是不是可以考虑将创建单个食品(如鸡肉卷.可乐等)方法提取出来,使用单独一个类协调这些食品的组合比

Java设计模式菜鸟系列(十五)建造者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435 建造者模式(Builder):工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理.简单起见,就拿之前的工厂方法模式进行修改一下就可以得到建造者模式. 一.uml建模: 二.代码实现 /** * 示例:建造者模式 * * 与工厂模式的区别:工厂类模式提供的是创建单个类,而建造者模式则是将各种产品集中起来进行管理 */ interface Sende

Java设计模式百例 - 建造者模式

本文源码见:https://github.com/get-set/get-designpatterns/tree/master/builder 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象,这种类型的设计模式属于创建型模式.建造模式可以将一个复杂对象的内部组成部分,与该对象本身的创建分离开来,从而使得复杂对象的组装更灵活. 文绉绉的话不宜多说,其实这种模式还是挺常见的: * 比如我们在订手机套餐的时候,无论是自选还是电信公司配置好的,通常一个套餐包括

设计模式学习笔记-建造者模式

一.概述 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示: 二.模式中的角色 Builder:为创建一个Product对象的各个部件指定抽象接口: ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件:定义并明确它所创建的表示:提供一个检索产品的接口: Director:构造一个使用Builder接口的对象: Product:表示被构造的复杂对象,ConcreteBuilder创建该产品的内部表示并定义它的装配过程:包含定义组成部件的类,

设计模式--17、建造者模式

[转]建造者模式 一个人活到70岁以上,都会经历这样的几个阶段:婴儿,少年,青年,中年,老年.并且每个人在各个阶段肯定是不一样的呀,我觉得可以说世界上不存在两个人在人生的这5个阶段的生活完全一样,但是活到70岁以上的人,都经历了这几个阶段是肯定的.实际上这是一个比较经典的建造者模式的例子了. 1.初识建造者模式 建造者模式实际上是常用的设计模式.顾名思义,builder的意思是建造者或者建筑工人,谈到建造自然会想到楼房.楼房是千差万别的,楼房的外形.层数.内部房间的数量.房间的装饰等等都不一样,

设计模式之禅——建造者模式

建造者模式定义: 建造者模式也叫做生成器模式--将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.) 例子:我们要生产一个简单车模(汽车模型),汽车模型要有启动.停止.引擎发出声音.喇叭响等功能.现在我要让用户根据自己的喜好来选择这些功能的顺序~(接着上一篇模板方法模式的例子) 我们做出了下面的设计,见UML图 见代码 //汽车模型的抽象类 public abstract class CarModel{ //sequence就是客户要求执行的方法的顺序 private A