《大话设计模式》——建造者模式
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中固定了,里面包含了添加食盐几克,添加食油几毫升,之后不论是什么时候,什么客人,只要来到这家饭店,吃到的炒面中添加的食盐和食油都是固定的。即不会出现时而太咸,时而太淡的情况。同时也避免由于步骤繁琐而遗漏其中一步或几步的情况。
与工厂模式区别:
建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。
以上是关于《大话设计模式》——建造者模式的主要内容,如果未能解决你的问题,请参考以下文章