《大话设计模式》——建造者模式

Posted 一响贪欢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《大话设计模式》——建造者模式相关的知识,希望对你有一定的参考价值。

建造者模式结构图

从上图中可以看到实现建造者模式至少需要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中固定了,里面包含了添加食盐几克,添加食油几毫升,之后不论是什么时候,什么客人,只要来到这家饭店,吃到的炒面中添加的食盐和食油都是固定的。即不会出现时而太咸,时而太淡的情况。同时也避免由于步骤繁琐而遗漏其中一步或几步的情况。

 

与工厂模式区别:

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

 

以上是关于《大话设计模式》——建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

大话设计模式-建造者模式(大鸟和小菜java版)

大话设计模式——造物者一般的建造者模式

大话设计模式第十三章之建造者模式

《大话设计模式》——读后感 好菜每回味不同——建造者模式之基础案例

建造者模式

《大话设计模式》——读后感 好菜每回味不同——建造者模式之经典案例