设计模式 | 建造者模式/生成器模式(builder)

定义:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

结构:(书中图,侵删)

一个产品类
一个指定产品各个部件的抽象创建接口
若干个实现了各个部件的具体实现的创建类
一个指挥者,用于控制具体的创建过程,包含一个抽象创建接口的引用
 

实例:

书中使用了游戏中创建人物的例子,人都有头、四肢、躯干这些固定组成部分,但是高矮胖瘦各不相同。
我瞬间就想到了捏脸系统,虽然说捏脸系统把人物的各种细节都交给了用户设置,细节到嘴唇的弧度都可以用户调节。
但实际上创建过程还是固定不变的,用户只需要将调整好的参数发送给系统,并不需要知道系统创建时是先“安”的头,还是先“安”的脚。
出于尽量不和书中举一样的例子,充分活跃大脑,举一反三的目的,我还得再想个别的例子。(其实还是没有跳脱出去,说到底既然是建造者模式就是造东西,想了半天也都是在想能造个什么其他的东西当例子。)
那就组装个电脑吧。
台式机一般都有主机、显示器、键盘、鼠标。
电脑类(产品类):
package designpattern.builder;

public class Computer {
    public String computerCase;
    public String monitor;
    public String keyboard;
    public String mouse;

    public String getComputerCase() {
        return computerCase;
    }

    public void setComputerCase(String computerCase) {
        this.computerCase = computerCase;
    }

    public String getMonitor() {
        return monitor;
    }

    public void setMonitor(String monitor) {
        this.monitor = monitor;
    }

    public String getKeyboard() {
        return keyboard;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }

    public String getMouse() {
        return mouse;
    }

    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    @Override
    public String toString() {
        return "Computer [computerCase=" + computerCase + ", monitor=" + monitor + ", keyboard=" + keyboard + ", mouse="
                + mouse + "]";
    }

}
抽象建造者接口:
package designpattern.builder;

public interface ComputerBuilder {
    void assembleComputerCase(Computer computer);// 组装主机

    void assembleMonitor(Computer computer);// 组装显示器

    void assembleKeyboard(Computer computer);// 组装键盘

    void assembleMouse(Computer computer);// 组装显示器
}
具体建造者类:
游戏型电脑建造者类:
package designpattern.builder;

public class GameComputerBuilder implements ComputerBuilder {
    @Override
    public void assembleComputerCase(Computer computer) {
        computer.setComputerCase("水冷机箱");
    }

    @Override
    public void assembleMonitor(Computer computer) {
        computer.setMonitor("4k显示器");
    }

    @Override
    public void assembleKeyboard(Computer computer) {
        computer.setKeyboard("机械键盘");
    }

    @Override
    public void assembleMouse(Computer computer) {
        computer.setMouse("人体工学鼠标");
    }

}
娱乐型电脑建造者类:
package designpattern.builder;

public class AmusementComputerBuilder implements ComputerBuilder {

    @Override
    public void assembleComputerCase(Computer computer) {
        computer.setComputerCase("普通机箱");
    }

    @Override
    public void assembleMonitor(Computer computer) {
        computer.setMonitor("普通显示器");
    }

    @Override
    public void assembleKeyboard(Computer computer) {
        computer.setKeyboard("普通键盘");
    }

    @Override
    public void assembleMouse(Computer computer) {
        computer.setMouse("普通鼠标");
    }

}
指挥者类:

package designpattern.builder;

public class ComputerBuilderDirect {

    public void assembleComputer(ComputerBuilder computerBuilder, Computer computer) {
        computerBuilder.assembleComputerCase(computer);
        computerBuilder.assembleMonitor(computer);
        computerBuilder.assembleKeyboard(computer);
        computerBuilder.assembleMouse(computer);
    }

    // 或者写成下面这样?可能具体情况具体分析吧

    public Computer assembleComputer(ComputerBuilder computerBuilder) {
        Computer computer = new Computer();
        computerBuilder.assembleComputerCase(computer);
        computerBuilder.assembleMonitor(computer);
        computerBuilder.assembleKeyboard(computer);
        computerBuilder.assembleMouse(computer);
        return computer;
    }
}
客户端:

package designpattern.builder;

public class Client {
    public static void main(String[] args) {
        ComputerBuilderDirect computerBuilderDirect = new ComputerBuilderDirect();
        // 组装游戏型电脑
        Computer gameComputer = new Computer();
        computerBuilderDirect.assembleComputer(new GameComputerBuilder(), gameComputer);
        System.out.println("游戏型电脑:");
        System.out.println(gameComputer);
        // 组装普通娱乐型电脑
        Computer assembleComputer = new Computer();
        computerBuilderDirect.assembleComputer(new AmusementComputerBuilder(), assembleComputer);
        System.out.println("普通娱乐型电脑:");
        System.out.println(assembleComputer);
    }
}
 结果输出:
游戏型电脑:
Computer [computerCase=水冷机箱, monitor=4k显示器, keyboard=机械键盘, mouse=人体工学鼠标]
普通娱乐型电脑:
Computer [computerCase=普通机箱, monitor=普通显示器, keyboard=普通键盘, mouse=普通鼠标]

总结:

这个设计模式在一个大体构建过程一致,构建过程的具体细节不同的对象创建时,可以使用。
首先是可以保证同类对象的构建过程一致,其次是分离客户端和具体实现,同样满足迪米特/最少知识法则。
 
(0)

相关推荐

  • 设计模式之建造者模式

    设计模式之建造者模式

  • 设计模式-创建型-建造者模式

    引言: 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.底盘.发动机.方向盘等各种部件.而对于大部分用户而言,无须知道这些部件的装配细节,也几乎不会 ...

  • 建造者模式(Bulider模式)详解

    在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成.例如,计算机是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘.鼠标等部件组装而成的,采购员不可能自 ...

  • 设计模式模式(四):建造者模式(生成器模式)

    建造者模式主要解决问题: 具备若干成员,当其中一个成员发生变化,其它成员也随着发生变化. 这种复杂对象的生成需要使用建造者模式来生成. 建造者设计模式的结构图: 来源:http://c.bianche ...

  • 建造者模式

    如果一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离,使得同样的构建过程可以创建不同的表示,那么比较适合采用建造者模式.  builer: 为创建产品的各个部分,统一抽象接口 Abuild ...

  • 设计模式-建造者模式

    建造者模式 也叫生成器模式,他是一个创建型模式 通用类图 Product产品类 ​通常是实现了模板方法模式,也就是有模板方法和基本方法. public class Product { public v ...

  • PHP设计模式之简单工厂模式

    PHP设计模式之简单工厂模式 先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式.毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式. ...

  • PHP设计模式之工厂方法模式

    PHP设计模式之工厂方法模式 上回说到,简单工厂不属于GoF的二十三种设计模式,这回可就来真家伙了,大名顶顶的工厂方法模式前来报道! GoF类图解释 工厂方法模式对比简单工厂来说,最核心的一点,其实就 ...

  • PHP设计模式之抽象工厂模式

    PHP设计模式之抽象工厂模式 工厂模式系列中的重头戏来了,没错,那正是传闻中的抽象工厂模式.初次听到这个名字的时候你有什么感觉?反正我是感觉这货应该是非常高大上的,毕竟包含着"抽象" ...

  • PHP设计模式之装饰器模式

    PHP设计模式之装饰器模式 工厂模式告一段落,我们来研究其他一些模式.不知道各位大佬有没有尝试过女装?据说女装大佬程序员很多哟.其实,今天的装饰器模式就和化妆这件事很像.相信如果有程序媛MM在的话,马 ...

  • PHP设计模式之责任链模式

    PHP设计模式之责任链模式 责任链模式,属于对象行为型的设计模式. Gof类图及解释 GoF定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这 ...

  • PHP设计模式之享元模式

    PHP设计模式之享元模式 享元模式,"享元"这两个字在中文里其实并没有什么特殊的意思,所以我们要把它拆分来看."享"就是共享,"元"就是元素 ...

  • PHP设计模式之中介者模式

    PHP设计模式之中介者模式 上回说道,我们在外打工的经常会和一类人有很深的接触,那就是房产中介.大学毕业后马上就能在喜欢的城市买到房子的X二代不在我们的考虑范围内哈.既然需要长期的租房,那么因为工作或 ...