Skip to main content

建造者模式

设计模式建造者模式About 2 min

建造者模式将复杂对象的构建与其表示相分离,这样相同的构造过程可以创建不同的对象。
通过只指定对象的类型和内容,建造者模式允许客户端对象构建一个复杂对象。客户端可以不受该对象构造细节的影响。这样通过定义一个能够构建其他类实例的类,就可以简化复杂对象的创建过程。
建造者模式生产一个主要产品,而该产品中可能有多个类,但是通常只有一个主类。当使用该模式的时候,可以一次创建所有的复杂对象。而其他模式一次就只能创建一个对象。

Alt text

建造者模式包含以下角色:

  • AbstractBuilder:抽象建造者
    这个角色用于规范产品对象的各个组成成分的建造。
  • ConcreteBuilder:具体建造者
    在指导者的调用下创建产品实例。
  • Director:指挥者
    调用具体建造者角色创建产品对象。
  • Product:产品角色

代码实现

为了说明建造者模式的使用,下面使用一个电脑产品构建的例子。

AbstractBuilder中我们定义创建产品的各个部件的抽象方法:

抽象建造者

public abstract class AbstractBuilder {

    protected Product product;

    public abstract AbstractBuilder setName();

    public abstract AbstractBuilder setCpu();

    public abstract AbstractBuilder setMemory();

    public abstract AbstractBuilder setStorage();

    public abstract AbstractBuilder setKeyboard();

    public abstract AbstractBuilder setScreen();

    public abstract AbstractBuilder setMouse();

    public Product build() {
        return this.product;
    }
}

具体建造者

ConcreteBuilder中实现了各个部件的构建方法,当然我们也可以扩展一些方法。

public class ConcreteBuilder extends AbstractBuilder {

    public ConcreteBuilder() {
        this.product = new Product();
    }

    

    @Override
    public ConcreteBuilder setName() {
        this.product.setName("MacBook Pro");
        return this;
    }

    @Override
    public ConcreteBuilder setCpu() {
        this.product.setCpu("Intel Core i7");
        return this;
    }

    @Override
    public ConcreteBuilder setMemory() {
        this.product.setMemory("16 GB");
        return this;
    }

    @Override
    public ConcreteBuilder setStorage() {
        this.product.setStorage("256 GB");
        return this;
    }

    @Override
    public ConcreteBuilder setKeyboard() {
        this.product.setKeyboard("USB");
        return this;
    }

    @Override
    public ConcreteBuilder setScreen() {
        this.product.setScreen("13.3-inch");
        return this;
    }

    @Override
    public ConcreteBuilder setMouse() {
        this.product.setMouse("USB");
        return this;
    }
}

产品类


public class Product {

    private String name;
    private String cpu;
    private String memory;
    private String storage;
    private String keyboard;
    private String screen;
    private String mouse;

    // warning: get set 方法省略,需要添加
  
    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", storage='" + storage + '\'' +
                ", keyboard='" + keyboard + '\'' +
                ", screen='" + screen + '\'' +
                ", mouse='" + mouse + '\'' +
                '}';
    }
}

指挥者

Director中调用AbstractBuilder中的方法进行产品的创建。

public class Director {

    private AbstractBuilder builder;

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

    public Product build() {
        return builder.setName()
                .setCpu()
                .setMemory()
                .setStorage()
                .setKeyboard()
                .setScreen()
                .setMouse()
                .build();
    }
}

开始生产

最后创建一个类调用Director类进行,产品的创建。

public class Client {
    
    public static void main(String[] args) {
        Director director = new Director(new ConcreteBuilder());
        Product product = director.build();
        System.out.println(product.toString());
    }
}

输出结果:

Product{name='MacBook Pro', cpu='Intel Core i7', memory='16 GB', storage='256 GB', keyboard='USB', screen='13.3-inch', mouse='USB'}
What do you think?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v3.0.0-alpha.10