大话设计模式读书笔记(建造者模式)

人物:小菜,大鸟

事件:小菜和大鸟去吃宵夜,小菜吃了一碗很香的炒面,然后大鸟想吃也叫了一碗,但发现这一碗却没有放盐,为什么同一个厨师做两次炒面,第一碗好吃,第二碗却不好吃呢,为什么像肯德基麦当劳这样虽然分布全国各地,但是做出来的味道却几乎一样呢,大鸟借此引出了设计模式中的建造者模式


 建造者模式:

1.建造者模式结构图

2.举例说明建造者模式

3.实现建造者模式的基本代码

 

建造者模式结构图

 

什么是建造者模式?

    以一个建模举例,当需要你构建一个胖的人和一个瘦的人,如果依次建一个人的头,手,肚子,脚等,可能会因为粗心导致缺胳膊少腿,而且每次建造人的需求可能不一样,有的要求瘦点的,有的要求手长一点的,那么如果按照各个部位依次敲代码建造,每次都有失误的风险,所以要像麦当劳肯德基那样将食品加工的流程抽象出来,也把构建一个人的流程抽象出来,那么构建人的部位是一套完整的流程,就不会缺胳膊少腿了。

    也就是说,建造一个人的过程是稳定的:头手脚等,构建人的细节是不同的:高矮胖瘦。这样将一个复杂对象的构建和它的表示分离,使得同样的构建过程能够创建不同的表示意图,这也称为建造者模式。    

 

建造者的基本代码

Product类 -- 产品类

@Slf4j
public class Product {
    List<String> parts = new ArrayList();

    public void add(String part) {
        parts.add(part);
    }

    public void show(){
        log.info("产品,创建: ");
        for(String s: parts) {
            log.info(s);
        }
    }
}

Builder类 -- 抽象建造者类:确定产品有A,B两个部件构成,最后用getResult()方法得到产品

public abstract class Builder {
    public abstract void buildPartA();
    public abstract void buildPratB();
    public abstract Product getResult();
}

ConcreteBuilder1和ConcreteBuilder2类是具体的建造者类

public class ConcreteBuilder1 extends Builder {
    private Product product = new Product();

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

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

    @Override
    public Product getResult() {
        return product;
    }
}
public class ConcreteBuilder2 extends Builder {
    private Product product = new Product();

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

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

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

Director类 -- 指挥者类

public class Director {
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPratB();
    }
}

客户端代码调用:

public static void main(String[] args) {
    Director director = new Director();
    Builder b1 = new ConcreteBuilder1();
    Builder b2 = new ConcreteBuilder2();

    director.construct(b1);
    Product p1 = b1.getResult();
    p1.show();

    director.construct(b2);
    Product p2 = b2.getResult();
    p2.show();
}

小结:所以,建造者模式是,在当创建复杂对象的算法,应该独立于该对象的组成部分,以及它们的装配方式时适用的模式

posted @ 2020-07-31 11:30  pmingup9012  阅读(83)  评论(0编辑  收藏  举报