zoukankan      html  css  js  c++  java
  • 大话设计模式读书笔记(建造者模式)

    人物:小菜,大鸟

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


     建造者模式:

    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();
    }

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

  • 相关阅读:
    在Ubuntu 桌面版 12.04 LTS安装并运行SSH
    将Tp-link无线路由器桥接到Dlink无线路由器上
    如何解决Win7将任务栏程序自动分组的困扰
    安装Ubuntu 桌面版 12.04 LTS 过程之记录
    #lspci | grep Eth
    做技术不能人云亦云
    如何使用FF的Firebug组件中的net工具查看页面元素加载消耗时间
    在Fedora8上安装使用ActiveMQ5.8
    多态继承中的内存图解 && 多态中的对象变化的内存图解
    孔子装爹案例_帮助理解多态的成员访问特点及转型
  • 原文地址:https://www.cnblogs.com/wencheng9012/p/13408727.html
Copyright © 2011-2022 走看看