zoukankan      html  css  js  c++  java
  • 《大话设计模式》——建造者模式

    建造者模式结构图

    从上图中可以看到实现建造者模式至少需要4个角色:

    1、director:指挥者。由指挥者根据需求决定调用哪个建造者生产哪种产品。

    1、builder:建造者接口。定义了建造一个产品所必须的所有流程。所有的建造者都需要实现该类,以确保实现建造一个产品所需的流程。

    2、concreteBuilder:具体建造者。每一个建造者,可以创建一种产品,产品细节在建造者中定义,因此多个产品对应多个建造者。

    3、product:具体产品。

    我们这里以厨师炒菜来举例:

    假如有一家大排档,它只有一个产品:炒面,目前有两个菜单,菜单上面严格要求了炒面时放的盐多少克,油多少毫升等等,这两个菜单一个是蛋炒面,一个是肉炒面,现在来了一个客人点了一碗蛋炒面,过了不久又来了一个客人点了一碗肉炒面。厨师就分别拿着这两个菜单去炒面。

    那么在这里:product是炒面,director是厨师,builder是炒面的过程,concreteBuilder是两个菜单。

    1、先定义炒面product

    public class Product{
        List<String> chaofen = new List<String>();
    
        public void add(String part){
            chaofen.add(part); //炒面里面可以添加蛋或者肉或者其他的东西
        }
    
    }

    2、然后定义炒面的步骤builder,分为两步,1添加面,2添加蛋或肉。还有一些细节油盐等我们这里为了简单就省略掉了。

    inteface Builder{
        void addNoodles(); //炒粉有两个步骤,这里添加面
        void addEggOrMeat(); //炒粉有两个步骤,这里添加蛋或者肉
        Product getProduct(); //炒粉完成,交给客人品尝
    }

    3、这里是菜单A蛋炒面concreteBuilderA

    public ConcreteBuilderA implement Builder{
        Product p = new Product();
        public void addNoodles(){ //添加面
            p.add("noodles");
        }
        public void addEggOrMeat(){ //添加蛋
            p.add("egg");
        }
        public Product getProduct(){
            return p;
        }
    }

    这里是菜单B肉炒面concreteBuilderB

    public ConcreteBuilderB implement Builder{
        Product p = new Product();
        public void addNoodles(){//添加面条
            p.add("noodles");
        }
        public void addEggOrMeat(){//添加
            p.add("meat");
        }
        public Product getProduct(){
            return p;
        }
    }

    4、指挥者厨师director,按照菜单的要求,不能少放一颗食盐,也不能少放一滴食油,更不能少放面条,或者少放鸡蛋或肉。

    public Director{
    
        public void buildProject(Builder b){
            b.addNoodles();
            b.addEggOrMeat();
        }
    }

    最后是有客人来点餐(客户端)

        public static void main(String[] args) {
            Director d = new Director(); //厨师上班
            Builder b1 = new concreteBuilderA(); //拿到菜单A蛋炒面
            Builder b2 = new concreteBuilderB(); //拿到菜单B肉炒面
            d.buildProduct(b1); //有客人点了蛋炒面,厨师拿着菜单A去做
            d.buildProduct(b2); //有客人点了肉炒面,厨师拿着菜单B去做
            Product p1 = b1.getProduct(); //菜单A蛋炒面完成,将蛋炒面放到前台
            Product p2 = b2.getProduct(); //菜单B肉炒面完成,将肉炒面放到前台
        }

    以上就是一个完整的建造者模式。下面我们来分析一下它的优点:

    1.封装性好。客人是不知道炒面是谁做的,也不知道做炒面的流程是什么,他只是点一碗蛋/肉炒面,厨师就会把做好的产品端出来。

    2.扩展性好。在我们上面的例子中只支持蛋炒面和肉炒面,假如有客人需要蛋炒饭,厨师只需要再拿到蛋炒饭的菜单C,按照菜单上面的步骤,将addNoodles()改为添加addRice()即可。客人并不知道我们的饭店发生了什么,他甚至什么都不需要修改,一切都是由我们厨师在后台负责处理好了。同时也不会影响之前的菜单A和菜单B的口味,他们依然各司其职。

    3.产品更规范。我们的产品是固定了的炒面,它的步骤已经在厨师director中固定了,里面包含了添加食盐几克,添加食油几毫升,之后不论是什么时候,什么客人,只要来到这家饭店,吃到的炒面中添加的食盐和食油都是固定的。即不会出现时而太咸,时而太淡的情况。同时也避免由于步骤繁琐而遗漏其中一步或几步的情况。

    与工厂模式区别:

    建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。

  • 相关阅读:
    MySQL------代码1024,can't get hostname for your address解决方法
    MySQL------存储过程的使用
    MyEclipse------如何添加jspsmartupload.jar,用于文件上传
    JQuery------实现鼠标点击和滑动不同效果
    CSS------如何让div中的div处于右下角
    JQuery------制作div模态框
    CSS------Filter属性的使用方法
    python使用元类
    python __new__()分析
    centos自带python2.6升级到python2.7。并解决yum pip easy_install pip等模块兼容性问题
  • 原文地址:https://www.cnblogs.com/yxth/p/7485573.html
Copyright © 2011-2022 走看看