2、设计模式之建造者模式

建造者模式(Builder)结构图
这里写图片描述

Builder是为创建一个Product对象的各个部分指定的抽象接口
Director:指挥者,是构建一个使用Builder接口的对象
ConcreteBuilder:具体建造者,实现Builder接口,构造和装配各个部件
Product:具体产品

什么时候需要使用建造者模式呢?
它主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部间的构建通常面临着复杂的变化。
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,如果需要改变一个产品的内部表示,
只需要再定义一个具体的建造者就可以了。

/**
 * 产品类 由多个部件组成
 * Created by ZhuPengWei on 2018/1/25.
 */
public class Product {
    List<String> parts = new ArrayList<String>();

    /**
     * 添加产品部件
     *
     * @param part 产品部件
     */
    public void add(String part) {
        parts.add(part);
    }

    /**
     * 列举所有的产品
     */
    public void show() {
        System.out.println("------产品创建-----");
        for (String part : parts) {
            System.out.println(part);
        }
    }

Builder:确定产品由两个部件PartA和PartB组成,并且声明一个得到产品建造后结果的方法getResult()

/**
 * 抽象建造者类
 * 
 * Created by ZhuPengWei on 2018/1/25.
 */
public abstract class Builder {

    public abstract void buildPartA();

    public abstract void buildPartB();

    public abstract Product getResult();

}

ConcreteBuilder1:具体建造者类

/**
 * 具体建造者类
 * Created by ZhuPengWei on 2018/1/25.
 */
public class ConcreteBuilder1 extends Builder {
    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.add("部件A");
    }

    @Override
    public void buildPartB() {
        product.add("部件B");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

ConcreteBuilder2:具体建造者类

/**
 * 具体建造者类
 * Created by ZhuPengWei on 2018/1/25.
 */
public class ConcreteBuilder2 extends Builder {

    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.add("部件X");
    }

    @Override
    public void buildPartB() {
        product.add("部件Y");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

Director:指挥者类

/**
 * 指挥者类
 * Created by ZhuPengWei on 2018/1/25.
 */
public class Director {
    /**
     * 用来指挥建造过程
     *
     * @param builder 建造者类对象
     */
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}

客户端代码,客户不知道具体的建造过程

/**
 * 客户端
 * Created by ZhuPengWei on 2018/1/25.
 */
public class Client {
    public static void main(String[] args) {
        // 指挥者
        Director director = new Director();
        Builder builder1 = new ConcreteBuilder1();
        Builder builder2 = new ConcreteBuilder2();
        // 指挥者用ConcreteBuilder1的方法来建造产品
        director.construct(builder1);
        Product p1 = builder1.getResult();
        p1.show();
        // 指挥者用ConcreteBuilder2的方法来建造产品
        director.construct(builder2);
        Product p2 = builder2.getResult();
        p2.show();

    }
}

运行结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_36144258/article/details/79170602