TypechoJoeTheme

IT技术分享

统计

建造者模式(Builder)——23种设计模式之创建型模式

2016-03-25
/
0 评论
/
677 阅读
/
正在检测是否收录...
03/25

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

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

建造模式利用一个导演者对象和具体建造者对象一个一个地建造出所有的零件,从而建造出完整的对象。建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的。

一、类图表示

创建者模涉及“导演者(Director)”,“抽象建造者(Builder)”,“具体建造者(ConcreteBuilder)”,“具体产品(Product)”

  • ①、Builder:为创建一个Product对象的各个部件指定抽象接口
  • ②、ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件。
  • ③、Director:构造一个使用Builder接口的对象
  • ④、Product:表示被构造的复杂对象,包含定义组成部件的类,包括这些部件装配成最终产品的接口

java-builder-model-2

java-builder-model-1

二、代码示例

//产品

public class Computer{

    private String cpu;
    private String memory;
    private String disk;
    public void setCpu(String cpu) {
        this.cpu= cpu;
    }
    public void setMemory(String memory) {
        this.memory= memory;
    }
    public void setDisk(String disk) {
        this.disk= disk;
    }
    public String getCpu() {
        return cpu;
    }
    public String getMemory() {
        return memory;
    }
    public String getDisk() {
        return disk;
    }

}

//联想产品

public class Lenovo extends Computer{ }
//抽象建造者

public interface Builder {

    void buildCpu();
    void buildMemory();
    void buildDisk();
    Computer buildComputer();
}
//具体建造者

public class LenovoBuilder implements Builder {

    Computer computer;
    public LenovoBuilder() {
        computer= new Lenovo();
    }
    @Override
    public void buildCpu() {
        computer.setCpu("build cpu");
    }
    public void buildMemory() {
        computer.setMemory("build memory");
    }
    public void buildDisk() {
        computer.setDisk("build Disk");
    }
    public Computer buildComputer() {
        return computer;
    }
}
//导演者

public class ComputerDirector {

    public Computer constructComputer(Builder cb) {
        cb.buildCpu();
        cb.buildMemory();
        cb.buildDIsk();
        return cb.buildComputer();
    }
}
//测试

public class Test {

    public static void main(String[] args) {
        ComputerDirector cd = new ComputerDirector();
        Computer computer= cd.constructComputer(new LenovoBuilder());
        System.out.println(computer.getCpu());
        System.out.println(computer.getMemory());
        System.out.println(computer.getDisk());

    }
}

三、优缺点分析

1、优点

  • ①、Director隔离了客户与生产过程,客户端只需确定具体建造者的类型即可
  • ②、建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。
  • ③、每一个具体建造者都相对独立,因此可以很方便地替换具体建造者或增加新的具体建造者。
  • ④、可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同方法中,使创建过程更加清晰
  • ⑤、增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”。

2、缺点

  • ①、如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • ②、如果产品内部变化复杂,可能会需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

四、使用场景

  • ①、需要生成的产品对象有复杂的内部结构。每一个内部成分本身可以是对象,也可以是一个组成部分
  • ②、需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程
  • ③、当产品对象的一个属性必须在另一个属性被赋值后才可以被赋值,使用该模式是一个很好的设计思想。
  • ④、在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。
  • ⑤、在很多游戏软件中,通过不同的具体建造者创建不同类型的地图或人物。
朗读
赞 · 0
版权属于:

IT技术分享

本文链接:

https://idunso.com/archives/1640/(转载时请注明本文出处及文章链接)