建造者模式

2020-06-22  本文已影响0人  nieniemin

什么是建造者模式

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

建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

模式角色

1 Builder:为创建一个产品对象的各个部件指定抽象接口。包含一个用来返回最终产品的方法Product getProduct()。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

UML类图

建造者模式

代码实现

public class Product {
    // 产品名称
    private String name;
    // 产品说明
    private String explain;
    // 生产日期
    private String dateOfManufacture;
    // 产品厂商联系电话
    private String phone;
    // 产品厂商地址
    private String address;

    public Product(String name, String explain, String dateOfManufacture) {
        this.name = name;
        this.explain = explain;
        this.dateOfManufacture = dateOfManufacture;
    }
....省略getter/setter/toString
}

public interface Builder {
    public void setAddress();
    public void setPhone();
    // 其会包含一个用来返回最终产品的方法Product getProduct()
    public Product getProduct();
}
public class ConcreteBuilder implements Builder {

    private Product product;

    public ConcreteBuilder(String name, String explain, String dateOfManufacture) {
        product = new Product(name, explain, dateOfManufacture);
    }

    @Override
    public void setAddress() {
        product.setAddress("产品生产地址");
    }

    @Override
    public void setPhone() {
        product.setPhone("产品联系电话");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}
public class Director {
    public void constructProduct(Builder concreteBuilder) {
        concreteBuilder.setAddress();
        concreteBuilder.setPhone();
    }
}
public class Client {
    public static void main(String[] args) {
        Director director = new Director();
        Builder concreteBuilder = new ConcreteBuilder("产品名字", "生产说明", "生产日期");
        director.constructProduct(concreteBuilder);
        Product product = concreteBuilder.getProduct();
        System.out.println(product);
// Product{name='产品名字', explain='生产说明', phone='产品联系电话', address='产品生产地址', dateOfManufacture='生产日期'}
    }
}

优点
使用建造者模式可以使客户端不必知道产品内部组成的细节。
具体的建造者类之间是相互独立的,这有利于系统的扩展。
具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。
缺点
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

建造者模式完整代码

上一篇 下一篇

猜你喜欢

热点阅读