创建模式 -- 建造者模式

一、小案例分析

1、功能需求:

  现需要建房子,建房流程:挖地基、砌墙、封顶。对于不同种类的房子(高楼,别墅),流程虽然一样,但是具体功能实现不同。如何实现建房子?

2、小菜鸡的答案:

(1)定义一个抽象接口,并定义三个抽象方法(挖地基、砌墙、封顶)。
(2)对于不同种类的房子,实现该接口,并重写相关方法即可。
(3)代码实现:

package builder.pattern;

/**
 * 测试类
 *
 */
public class BuilderDemo {
    public static void main(String[] args) {
        System.out.println("建别墅流程:");
        BuilderHouse villa = new Villa();

        System.out.println("\n建高楼流程");
        BuilderHouse highBuild = new HighBuild();
    }
}

/**
 * 定义一个建房子的接口,并定义其流程
 */
interface BuilderHouse {
    void scoopHole(); // 挖地基

    void buildWall(); // 砌墙

    void topOff(); // 封顶
}

/**
 * 建别墅,实现建房子的接口
 *
 */
class Villa implements BuilderHouse {
    /**
     * 建别墅流程
     */
    public Villa() {
        scoopHole();
        buildWall();
        topOff();
    }

    @Override
    public void scoopHole() {
        System.out.println("挖10米地基");
    }

    @Override
    public void buildWall() {
        System.out.println("砌10层墙");
    }

    @Override
    public void topOff() {
        System.out.println("楼顶建个游泳池");
    }
}

/**
 * 建高楼流程,实现建房子的接口
 *
 */
class HighBuild implements BuilderHouse {
    /**
     * 建高楼流程
     */
    public HighBuild() {
        scoopHole();
        buildWall();
        topOff();
    }

    @Override
    public void scoopHole() {
        System.out.println("挖30米地基");
    }

    @Override
    public void buildWall() {
        System.out.println("砌60层墙");
    }

    @Override
    public void topOff() {
        System.out.println("楼顶建个停机坪");
    }
}

(4)代码分析:
  容易理解并操作,但是程序的扩展性不好,且耦合性强(将产品与创建产品的过程封装在一起)。
(5)UML图

二、建造者模式

1、什么是建造者模式

  又叫生成器模式,其将复杂的对象的建造过程抽象出来,并在其子类中去实现不同的建造。用户只需要去调用就行,不需要管建造的内部细节如何实现。简单的理解为,将一堆零件拼成一个整体,而零件是抽象的,并由不同的子类去实现,用户不需要管零件是如何形成的,能组装就行。

2、建造者模式的核心角色

(1)产品(Product):一个具体的产品对象。
(2)抽象建造者(Builder):定义一个接口或抽象类,内部定义生成产品各个零件的抽象方法。
(3)具体建造者(ConcreateBuilder):实现接口,并重写生成各零件的方法。
(4)组装者(Commander):按照流程拼接零件,并返回一个对象。
(5)代码实现:

package builder.pattern;

/**
 * 测试类
 *
 */
public class BuilderDemo {
    public static void main(String[] args) {
        System.out.println("建别墅流程:");
        HouseBuilder villaBuilder = new VillaBuilder();
        HouseCommandar villaCommandar = new HouseCommandar(villaBuilder);
        System.out.println(villaCommandar.createHouse());

        System.out.println("\n建高楼流程");
        HouseBuilder highBuildBuilder = new HighBuildBuilder();
        HouseCommandar highBuildCommandar = new HouseCommandar(highBuildBuilder);
        System.out.println(highBuildCommandar.createHouse());
    }
}

/**
 * 产品类
 *
 */
class House {
    private String basis;
    private String wall;
    private String roof;

    public String getBasis() {
        return basis;
    }

    public void setBasis(String basis) {
        this.basis = basis;
    }

    public String getWall() {
        return wall;
    }

    public void setWall(String wall) {
        this.wall = wall;
    }

    public String getRoof() {
        return roof;
    }

    public void setRoof(String roof) {
        this.roof = roof;
    }

    @Override
    public String toString() {
        return "House [basis=" + basis + ", wall=" + wall + ", roof=" + roof + "]";
    }
}

/**
 * 抽象建造者,内部定义生成产品各个零件的抽象方法。
 *
 */
abstract class HouseBuilder {
    House house = new House();

    public abstract void scoopHole(); // 挖地基

    public abstract void buildWall(); // 砌墙

    public abstract void topOff(); // 封顶

    public House getHouse() {
        return house;
    }
}

/**
 * 具体建造者,建别墅,继承抽象类,并重写相关方法
 *
 */
class VillaBuilder extends HouseBuilder {
    @Override
    public void scoopHole() {
        house.setBasis("挖10米地基");
    }

    @Override
    public void buildWall() {
        house.setWall("砌10层墙");
    }

    @Override
    public void topOff() {
        house.setRoof("楼顶建个游泳池");
    }
}

/**
 * 建高楼流程,实现建房子的接口
 *
 */
class HighBuildBuilder extends HouseBuilder {

    @Override
    public void scoopHole() {
        house.setBasis("挖30米地基");
    }

    @Override
    public void buildWall() {
        house.setWall("砌60层墙");
    }

    @Override
    public void topOff() {
        house.setRoof("楼顶建个停机坪");
    }
}

/**
 * 组装者,控制零件组合流程,并返回一个产品对象
 */
class HouseCommandar {
    private HouseBuilder houseBuilder;

    /**
     * 获取具体的建造者
     */
    public HouseCommandar(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    /**
     * 控制建房流程,并返回一个房子实例
     *
     * @return 房子实例
     */
    public House createHouse() {
        houseBuilder.scoopHole();
        houseBuilder.buildWall();
        houseBuilder.topOff();
        return houseBuilder.getHouse();
    }
}

(6)代码分析:
  相比于上例,其将控制产品流程的代码抽出来了。使产品与产品构建流程分离,从而在一定程度上解耦。当扩展代码时,只需继承HouseBuilder 并重写相关方法即可。
(7)UML图:

3、抽象工厂模式与建造者模式的区别

(1)抽象工厂模式是根据不同的工厂去创建一个对象。
(2)建造者模式是根据流程去组装一个对象。

三、JDK源码分析(StringBuilder)

1、部分源码

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{

}

abstract class AbstractStringBuilder implements Appendable, CharSequence{
    //内部定义了一系列方法,且部分方法返回值类型为AbstractStringBuilder
    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
     public AbstractStringBuilder deleteCharAt(int index) {
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        System.arraycopy(value, index+1, value, index, count-index-1);
        count--;
        return this;
    }
} 

2、源码分析

  AbstractStringBuilder 内部定义了一系列返回值类型为AbstractStringBuilder 的方法,这些方法可以组合起来,形成链式调用(产品构建流程),根据链式调用来组装成最后返回的对象。
即StringBuilder 是组装者与具体建造者。AbstractStringBuilder 是抽象建造者。
  

原文地址:https://www.cnblogs.com/l-y-h/p/11360427.html

时间: 2024-08-26 11:00:05

创建模式 -- 建造者模式的相关文章

创建型模式 建造者模式

创建型模式 建造者模式 1) Builder:为创建产品各个部分,统一抽象接口. 2) ConcreteBuilder:具体的创建产品的各个部分,部分A, 部分B,部分C. 3) Director:构造一个使用Builder接口的对象. 4) Product:表示被构造的复杂对象.         ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口.        适用情况:一个对象的构建比较复杂,将一个对象的构建和对象

第6章 创建型模式—建造者模式

1. 建造者(Builder,或生成器)模式的定义 (1)将一个复杂对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示. ①上述提到的“构建”是指构造过程的算法(即构造顺序,位于director类中),“表示”指生成各部件的具体细节(或叫实现,位于Builder或其子类中). ②由指导者(director)来指导构造过程,而建造者(builder)负责每步的对象的具体实现和组装各部件. ③指导者可以重用构建过程,而生成器是可以被切换的具体实现. (2)建造者模式的结构和说明 ①Buil

(五)(创建型模式)建造者模式

一.建造者模式(Builder Pattern): 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.建造者模式是一种对象创建型模式. 二.应用场景: 建立一个复杂产品,根据产品的类型决定实例化产品的结果,不需要考虑产品的构想过程. 三.应用实例: 动物界的掌控者Tom,觉得出门走入太慢了,想建造一些车代步,但是目前还没有想好什么类型的车,建立一个车辆建造中心,能根据Tom大哥的车型要求,制造出指定的车型.(要求:具体的车型易扩展) 四.方案: UML图: 代码: pac

4 创建型模式-----建造者模式

模式动机:一个对象由若干部件组成,而组合这些部件的过程比较复杂,因此可以把这个组合工作交给建造者来完成,建造这返回给客户的是一个组装好的对象. 模式定义(Builder Pattern):将一个复杂对象的构建与表示分离开来,使得同样的构建过程可以创建不同的表示形式. 模式结构图: 其中包含抽象建造者Builder.具体建造者ConcreteBuilder.指挥者Director.产品Product.该模式中引入了Director,负责控制产品的生产及其与用户的隔离工作.Director针对抽象建

生成器模式(建造者模式)

生成器模式(或者叫建造者模式) 将一个复杂类的 表示 与其 构建过程 相分离,使得相同的构建过程.能够得出不同的表示. 如果我们使用建造者模式,那么用户只需要指定类型就好了,过程在调用的时候就不需要想了.因为我们已经定义好了. 其中Builder定义一个构建过程. 而ConcretBuilder是按照这一过程实现的不同表示. Director是整个模式的指挥者.客户端在调用的时候,要告诉Director具体使用哪个ConcreBuilder.其实也就是传递一个Builder对象.

c++ 创建型模式-建造者模式(Builder)

1) 意图: 将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示 2) 结构: 其中: Builder是提供生成Product各个部件的抽象接口 ConcreteBuilder 实现Builder的各个接口 Director 构造一个使用Builder接口的对象 Product 表示被构造的复杂对象 3) 适用性: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时 当构造过程必须允许被构造的对象有不同的表示时 4) 举例: 1 #include <iost

Builder模式(建造者模式)

在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则. 我们常常会面临编写一个这样的实现类(假设类名叫DoDoContact),这个类拥有多个构造函数, DoDoContact(String name); DoDoContact(String name, int age); DoDoContact(S

C#设计模式之创建类模式:建造者模式

无论在现实世界中还是软件工程中,都存在一些复杂对象,他们拥有多个组成部分,例如汽车.电脑.冰箱.洗衣机等.他们包含了大量的零部件.对于大部分用户而言,他们并不知道这些部件的装配细节,也几乎不会适用单独某部件,而是使用一辆完整的汽车,一个完整的冰箱或洗衣机.如何将这些部件组装成一个完整的产品并返回给客户,是建造者模式需要解决的问题,建造者模式可以将部件本身和他们的组装过程分开,它关注如何一步步创建一个包含多个组成部分的复杂对象,用户只需要指定复杂对象的类型即可得到该对象,而不是知道其内部的实现细节

设计模式那点事读书笔记(3)----建造者模式

建造者模式: 建造者模式是将复杂的对象构造进行分离,使得每个部件完成比较独立的工作.通过抽象类,接口来约束建造的过程. 解决什么问题: 当生成的产品对象内部具有复杂的结构. 当复杂对象需要与表示分离,可能需要创建不同的表示时. 当需要向客户隐藏产品内部结构表现时. UML: 代码结构: 商品的实体: package com.demo.builder.model; /** * 产品实体 */ public class MobilePackage { private float money; pri