伪装配厂模式
来源:互联网 发布:安装手机淘宝客户端 编辑:程序博客网 时间:2024/05/21 08:41
(2.2.2 伪装配厂/建造者模式)
工厂模式中描述的,是工厂能够直接提供产品的模式。本节讲述的装配厂模式/建造者模式,则由于产品较复杂因而不再简单的提供,builder/装配厂/建造者需要一个指导者说明装配过程,指导者调度(员) /director。(实际工厂的车间中,都有一个调度)
2.2 装配厂模式
2.2.1 串接式setter模式 如StringBuilder,参见Effective Java。
2.2.2 伪 装配厂模式 最2 的伪建造者模式
2.2.3 真正的装配厂模式
伪装配厂模式
在一些关于设计模式的书籍中,讲解建造者模式的例子和演示程序,并非GoF所称的建造者模式(3.2),例如一些人和书籍中使用的游戏角色设计例子,事实上使用的是工厂方法+模板方法模式【参见[3.3模板方法模式(5.10)】。之所以称之为伪装配厂模式,因为它的适用场景和装配厂模式相似。
产品类型已知型装配厂模式(伪 装配厂模式):它建造的产品,可以有各种不同的部件,但产品属于同一种类型。
以电脑/MyPC的装配为例。电脑是一个完整的复杂产品,它包含多个成员变量表示的对象,这些成员变量可以称为产品的部件或零件,如CUP、显示器/ Display和硬盘/ HD。你可以将这些部件设计成抽象类,如CUP有Intel和AMD子类,使得更有代表性。MyPC及其部件,我们将它们放在package creational.builder.pc包中。
1.Client仅仅依赖于装配厂
你/Client到电脑市场配一台机器,你(假设是一个小白)无须知道产品的内部组成与装配方式,你也不需要自己买各种部件自己装机,你只需要知道找一家装机店/PCBuilder即可。PCBuilder有很多很多的子类,如坑人的KKPCBuilder、傻傻的SSPCBuilder等。不管哪一家,假定它们都按照一定的流程组装电脑,该流程封装为方法construct()。很自然地,可以将construct()放在PCBuilder中作为模板方法。例程 2 9模板方法package creational.builder.pseudoBuilder;import creational.builder.pc.*;public abstract class PCBuilder{ public void addCPU(){} public void addDisplay(){} public void addHD(){} public abstract MyPC getResult(); public void construct(){ addCPU(); addDisplay(); addHD(); }}注意:PCBuilder中定义了一个abstract MyPC getResult(),这是工厂方法。
配机器的小白现在可以买装机的结果了。
package creational.builder.pseudoBuilder;import creational.builder.pc.*;import tool.God;/** * 配机器的小白 * * @author yqj2065 * @version 0.1 */public class Client{ public static void main(String args[]){ PCBuilder b = (PCBuilder)God.create("2-9-Builder"); b.construct(); MyPC pc = b.getResult(); System.out.println(pc); } public static void test(){ PCDirector director = new PCDirector("2-9-Builder"); MyPC pc = director.construct(); System.out.println(pc); }}
本来,这是使用了工厂方法+模板方法的这种多种设计模式的组合应用的典型例子,值得学习。
2. 调度的作用
然而,有人对照GoF的建造者模式,生编硬造地按照建造者模式(3.2)的类图,将模板方法封装到调度(员) /Director类中,就曲解了建造者模式(3.2)的“适用性”。
下面是某些书籍中的Director:
package creational.builder.pseudoBuilder;import creational.builder.pc.*;/** * 生编硬造 */public class PCDirector{ private PCBuilder b; public PCDirector(String builder){ this.b = b ; } public MyPC construct(){ b.addCPU(); b.addDisplay(); b.addHD(); return b.getResult(); }}可以用Client.test()测试。如此编程,Client可以仅仅依赖于调度(员) /Director,如图2-4所示。有人说,Director相当于装配店的销售人员,此实现使得Client与Build隔离。(但是,建造者模式的本意是产品的构建过程construct()与产品类型的隔离。)
伪装配厂模式的核心将PCBuilder定义的装配电脑的流程construct()搬到Director中。
此时,调度(员)能够发挥作用的场合,是存在多种Director,它们封装对象构成的算法。例如买一碗牛肉粉,客户给出一些参数——嘱咐加或不加葱、加多少辣椒。调度(员) /Director的construct()描述该需求并让任意的牛肉粉生产者照此办理;另外的客户则可能需要另一个construct()。
在伪装配厂模式中,Director应用策略模式(封装抽象的construct()方法)、Director的子类应用模板方法模式,而PCBuilder应用工厂方法模式。
伪装配厂模式具有如下特点:
- 生产的产品属于一个产品族。例如本例中的MyPC是一个具体的类;而在游戏角色设计时,不管是天使、英雄还是魔鬼,都是某一个类如Actor的对象。
- 伪建造者模式的生产流程由一个模板方法控制,模板方法的目的是控制组装过程/方式和组装逻辑。它决定了产品部件的所有选项,最终的产品有固定的组成部分或一些可选项。例如买一碗牛肉粉,可能需要嘱咐加或不加葱、加多少辣椒。再例如生产有门、引擎、轮子、框架的产品,而产品为汽车、摩托、自行车(没有门和引擎)。
- 通过依赖注入,AcerBuilder可以配置不同的部件(如果CPU等为抽象类,AcerBuilder可以在CPU、显示器和硬盘的各种品牌、规格中组合)。通过依赖注入,客户One可以依赖抽象类PCBuilder。
- 注意,此时PCBuilder定义了方法public abstract MyPC getMyPC(),以返回装配后的产品。真正的建造者模式中产品没有共同的抽象类。
最后编辑时间:2015.9.5
- 伪装配厂模式
- 真正的装配厂模式(builder pattern)(3.2)
- 伪分布式运行模式
- incredibuild 单机模式(伪)
- 伪中介模式(5.5)
- 伪集群模式zookeeper
- zookeeper 伪集群模式
- flume伪分布模式实践
- Hadoop伪分布式模式测试
- HADOOP伪分布式模式 配置
- hadoop伪分布模式配置
- Hadoop伪分布模式搭建
- flume伪分布模式实践
- Hadoop伪分布模式安装
- Hadoop伪分布模式操作
- Hadoop单机伪分布式模式
- Hadoop伪分布模式安装
- 伪分布模式安装Hadoop
- Yii二级联动下拉菜单
- 已弃用ANSI API
- spring 中的@Resource
- Miscellanies of iOS 3) Managing Memory with ARC
- 63(85)--windows internals mark david alex
- 伪装配厂模式
- jdk-7u3-linux-i586.tar.gz安装
- CommonJS简介
- ASP.NET MVC2 如何 使用 Profile 的问题及解决
- java swing 列表的显示使用(转)http://endual.iteye.com/blog/1526689
- [笔试] 2012-5-6 baidu Written examination
- [笔试] 线程和进程区别和联系。什么是“线程安全”?
- 编辑《架构师》有感
- 一个华为人辞职创业后的几个反思