设计模式学习笔记(六) 建造者模式

该篇主要说的是建造者模式。

定义

建造者模式也叫作生成器模式。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

角色

1.产品类

需要生成的类,代码如下:

public class Computer {
    private List<String> part = new ArrayList<>();
    public void add(String str){
        part.add(str);
    }
    public void doSomething(){
        System.out.println("产品内部独立的业务逻辑");
        part.forEach(s->{
            System.out.println(s);
        });
    }
}

2.建造者

抽象建造者:

public abstract class Builder {
    // 设置产品的不同部分,获得不同的产品
    public abstract void setPart();
    // 建造产品
    public abstract Computer bulidProduct();
}

建造者实例:

public class ComputerBuilder extends Builder{

    private Computer computer = null;

    public ComputerBuilder() {
        this.computer = new Computer();
    }
    @Override
    public void setPart() {
        /**
         * 产品类的内部逻辑
         */
        computer.add("cpu");
        computer.add("主板");
        computer.add("硬盘");
        computer.add("组装");
    }
    @Override
    public Computer bulidProduct() {
        return computer;
    }
}

3.导演类

public class Director {

    private ComputerBuilder computerBuilder = new ComputerBuilder();

    public Computer getComputer(){
        /**
         * 设置不同的零件,产生不同的产品
         */
        System.out.println("想要组装电脑");
        computerBuilder.setPart();
        return computerBuilder.bulidProduct();
    }
}

运行代码及结果

运行代码

   public static void main(String[] args) {

        Director director = new Director();
        Computer computer = director.getComputer();
        computer.doSomething();
    }

结果:

想要组装电脑
产品内部独立的业务逻辑
cpu
主板
硬盘
组装

建造者模式优缺点

优点:

  1. 易于解耦
    将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
  2. 易于精确控制对象的创建
    将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
  3. 易于拓展
    增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。

    每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。


缺点
  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  2. 果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

注意:建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗地说就是零件的装配,顺序不同产生的对象也不同。

猜你喜欢

转载自blog.csdn.net/dulei17816/article/details/80607138