建造者模式

 

一、建造者模式

当需要创建一些复杂的对象,而且这些对象当中的内部建造顺序稳定的时候,就可以使用建造者模式。

即是将一个复杂对象的构造与表示分离,使得同样的构建过程可以创建不同的表示,提了依赖倒转原则,细节依赖于抽象。

二、结构图

Product是具体产品;

Builder是为创建一个Product对象的各个部件指定的抽象接口;

而ConcreteBuilder则是具体的建造者,实现Builder接口,实现各个部件构造的细节,构造和装配各个部件;

Director充当一个指挥的角色,根据客户需要构建一个使用Bilder接口的对象。

 三、示例

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

//产品类,由多个部件构成
class Product{
    List<String> parts=new ArrayList<>();
    //添加产品部件
    public void add(String content){
        parts.add(content);
    }
    public void show(){
        System.out.println("创建的产品:");
        for (String content:parts) {
            System.out.println(content);
        }
    }
}

//Builder类,抽象建造者,确定产品由什么部件组成,
interface Builder{
    void buildPartA();
    void buildPartB();
    Product getResult();
}

//ConcreteBuilder类是具体建造者
class ConcreteBuilderOne implements Builder{
    private Product product=new Product();
    @Override
    public void buildPartA() {
        product.add("one的部件A");
    }

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

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

class ConcreteBuilderTwo implements Builder{
    private Product product=new Product();
    @Override
    public void buildPartA() {
        product.add("two的部件A");
    }

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

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

//Director类是指挥者,指挥建造过程
class Director{
    public void construct(Builder builder){
        builder.buildPartA();
        builder.buildPartB();
    }
}

public class BuilderPattern {
    public static void main(String[] args) {
        //最后,客户无需知道具体的建造过程
        Director director=new Director();
        Builder concreteBuilderOne=new ConcreteBuilderOne();
        Builder concreteBuilderTwo=new ConcreteBuilderTwo();

        director.construct(concreteBuilderOne);
        Product productOne=concreteBuilderOne.getResult();
        productOne.show();

        director.construct(concreteBuilderTwo);
        Product productTwo=concreteBuilderTwo.getResult();
        productTwo.show();
    }
}

输出结果:

posted @ 2019-07-27 17:04  甜树果子二号  阅读(163)  评论(0编辑  收藏  举报