设计模式-行为型模式-创建者模式

Introduce:

创建者模式属于创建型模式,其核心思想是将一个复杂对象的构建算法与它的构成部件、组装方式分离,使得构建算法和组装方式可以独立应对变化,那么部件可以被复用,组装方式可以适应不同的变化,不同的构建算法可以得到不一样的结果。创建者模式主要由5部分构成:Abstrct Builder, Concrete Builder, Abstract Product, Concrete Product and Director。

我们可以举个例子,盖房子。房子是Abstract Product,洋房、别墅、茅草屋...具体的Product;工人是Abstract Builder,瓦匠工、木工、打地基的工匠、铺楼板的工匠...具体的Builder,这些工匠都有一技之长,或者好几手绝活,但是要是让他们自己独立盖一幢房子,他们是不知道怎么盖的,他们只能干自己特长的事,但是Director知道怎么盖房子(什么样的房子怎么盖他都会),因为他上过学,纸上的功夫那是刚刚的,但是呢你要让他打地基,他干不了,你要让他搬砖,他说“他会”(程序员不都是搬砖吗),结果被农民工笑掉大牙;有人要盖房,什么样的需求,给Director一说,他就开始吩咐各类工人干活,谁先干(当然是先打地基,旧房改造不需要打地基),谁接着干,这都是有策略的(这里引入策略模式,根据客户的需求去生成对应的产品)。

Advantages and Disadvantages

优点:在创建者模式中,客户端不用再负责Product的创建与组装,而是将这个Product的创建过程交给具体的创建者,客户端只负责调用对象,这样就能各司其职,Director就只管怎么设计房子,怎么盖;各类民工只要熟练自己的绝活就行。

缺点:如果不能复用Builder,每个Builder被调用的次数少,每个Product差异大,那么就需要很多Builder,增加了代码的复杂性,如果我对现有的Builder的功能做了修改,也同样会影响其他Product。

下面的Demo我只写了一个Builder,具体环境中可以自己把握,在实际项目中我在用创建者模式的同时也引入了策略模式。

具体产品,可做抽象

package BuilderPattern;

public class Room {
    private String foundation;
    private String window;
    private String door;
    private String floor;
    private String roof;

    public String getFoundation() {
        return foundation;
    }

    public void setFoundation(String foundation) {
        this.foundation = foundation;
    }

    public String getWindow() {
        return window;
    }

    public void setWindow(String window) {
        this.window = window;
    }

    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 getRoof() {
        return roof;
    }

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

抽象创建者

package BuilderPattern;

public interface IBuilder {
    void buildFoundation();
    void buildWindow();
    void buildDoor();
    void buildFloor();
    void buildRoof();
    Room getRoom();
}

具体创建者

package BuilderPattern;

public class Builder implements IBuilder {
    private Room room;

    public Builder() {
        this.room = new Room();
    }

    @Override
    public void buildFoundation() {
        System.out.println("Build foundation...");
    }

    @Override
    public void buildWindow() {
        System.out.println("Build window...");
    }

    @Override
    public void buildDoor() {
        System.out.println("Build door...");
    }

    @Override
    public void buildFloor() {
        System.out.println("Build floor...");
    }

    @Override
    public void buildRoof() {
        System.out.println("Build roof...");
    }

    @Override
    public Room getRoom() {
        return this.room;
    }

}

Director

package BuilderPattern;

public class Director {
    private IBuilder builder;

    public Director() {}

    public Director(IBuilder builder) {
        this.builder = builder;
    }

    public void orderBuilder() {
        if (null != this.builder) {
            // First build foundation;
            builder.buildFoundation();

            // Second build floor
            builder.buildFloor();

            // Third build door and window
            builder.buildDoor();
            builder.buildWindow();

            // Fourth build roof
            builder.buildRoof();
        }
    }
}

调用

package BuilderPattern;

public class Main {

    public static void execBuilderPattern() {
        System.out.println("Builder Pattern:");
        // Builder implements all build method, while they don‘t know how to build a room.
        Builder builder = new Builder();

        // Director know how to build a room, but him doesn‘t know how to work.
        Director director = new Director(builder);
        director.orderBuilder();
        Room room = builder.getRoom();
        System.out.println("End---------------------------");
    }

}
时间: 2024-08-10 00:05:33

设计模式-行为型模式-创建者模式的相关文章

设计模式(五)创建者模式(Builder)-创建型

创建者模式Builder 创建者模式就是将一个复杂对象的构建和它的表示分离,使的同样的构建过程可以创建不同的表示,而在客户端不用知道对象的构建细节.当系统需要创建一组复杂的对象,而且这个复杂的对象组装起来比较麻烦时,就可以使用创建者模式. 将抽象工厂模式中的功能类全部抽取出来放到一个类中 工厂类就是只负责对象的创建,不负责对象的组装,通过Director类来进行组装, 抽象工厂模式和创建者模式很类似,只是创建者模式更进一步的实现了类的单一职责 创建者模式 创建者模式的实现原理 创建者模式实际上就

[设计模式-行为型]责任链模式(Chain of Responsibility)

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

设计模式(行为型)之策略模式(Strategy Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之迭代器模式(Iterator Pattern)>http://blog.csdn.net/yanbober/article/details/45497881 概述 使用策略模式可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法,在这里,每一个封

设计模式(行为型)之迭代器模式(Iterator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之观察者模式(Observer Pattern)>http://blog.csdn.net/yanbober/article/details/45484749 概述 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构

设计模式(行为型)之备忘录模式(Memento Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之中介者模式(Mediator Pattern)>http://blog.csdn.net/yanbober/article/details/45533335 概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无

设计模式(行为型)之解释器模式(Interpreter Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之访问者模式(Visitor Pattern)>http://blog.csdn.net/yanbober/article/details/45536787 概述 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个

设计模式(行为型)之命令模式(Command Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之策略模式(Strategy Pattern)>http://blog.csdn.net/yanbober/article/details/45498567 概述 在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收

设计模式(行为型)之模板方法模式(Template Method Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之命令模式(Command Pattern)>http://blog.csdn.net/yanbober/article/details/45500113 概述 模板方法模式是一种基于继承的代码复用,它是一种类行为型模式:是结构最简单的行为型设计模式,在其结构

设计模式(行为型)之状态模式(State Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之模板方法模式(Template Method Pattern)>http://blog.csdn.net/yanbober/article/details/45501715 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中