代码改变世界

建造者模式

2019-03-01 14:46  剑动情缥缈  阅读(179)  评论(0编辑  收藏  举报

1.基本概念

  • 将对象的构建过程独立出来,使得同样的创建过程可以产生不同的对象
  • 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象
  • 用户只负责给出负责对象,建造者模式负责按顺序创建对象的各个组件
  • UML

  

 

2.代码

  • Client只负责跟Director交流需求,Director将指挥具体创建者进行对象创建
package com.chengjie;

import java.util.ArrayList;
import java.util.List;

class Computer {
    private List<String> parts = new ArrayList<String>();

    public void add(String obj) {
        parts.add(obj);
    }

    @Override
    public String toString() {
        return "Computer{" +
                "parts=" + parts +
                '}';
    }
}

class Director {
    public void constructComputer(Builder build) {
        build.buildCPU();
        build.buildMB();
        build.buildMEM();
        build.buildPOWER();
    }
}

abstract class Builder {
    abstract void buildCPU();
    abstract void buildMB();
    abstract void buildMEM();
    abstract void buildPOWER();
    abstract Computer getComputer();
}

class ComputerBuilder extends Builder {
    private Computer computer = new Computer();
    @Override
    void buildCPU() {
        computer.add("添加CPU");
    }

    @Override
    void buildMB() {
        computer.add("添加主板");
    }

    @Override
    void buildMEM() {
        computer.add("添加内存");
    }

    @Override
    void buildPOWER() {
        computer.add("添加电源模块");
    }

    public Computer getComputer() {
        return computer;
    }
}

public class TestBuilderPattern {
    public static void main(String[] args) {
        //创建指挥者
        Director director = new Director();
        //创建组装电脑这
        Builder builder = new ComputerBuilder();
        //指挥者指挥组装电脑者进行电脑组装
        director.constructComputer(builder);
        Computer computer =builder.getComputer();
        System.out.println(computer);
    }
}
View Code

3.优点

  • 方便用户创建复杂的对象(不需要知道实现过程)
  • 代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)
  • 易于解耦:将产品本身与创建过程进行解耦,可以通过相同的创建过程,创建不同的对象,即细节依赖抽象原则
  • 符合开闭原则:当有新产品出现,只需要添加具体建造者

4.缺点

  • 需要产品之间具有很多共同点,如果产品之间差距很大,则不适用

5.应用场景

  • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品

6.参考

  https://www.jianshu.com/p/be290ccea05a