最近花些时间重温一下设计模式,主要是四人帮的经典23种设计模式,再扩展一下思路,做个笔记,以便于以后方便查询
工厂模式属于创建式模型,顾名思义,是提供创建各种对象的类,工厂模式又分为以下几种
简单工厂(Simple Factory)模式:又称静态工厂方法(Static
Factory Methord)模式
工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic
Factory)模式或虚拟构造子(Virtual Constructor)模式
抽象工厂(Abstract Factory)模式:又称工具箱(Kit或Toolkit)模式。
简单工厂模式,或称静态工厂方法模式,是不同工厂方法模式的一个特殊实现,其实就是工厂类是单实例的,一个创建各种对象的集合类,
用例子说明一下
比如有一个农场,生产各种水果,有苹果(Apple)、草莓(Strawberry)、葡萄(Grape);农场的园丁(FruitGardener)要根据客户的需求,提供相应的水果。下面看看是如何用简单工厂模式实现这个过程的,如下图:
简单工厂模式的实现
1使用接口或者抽象类实现多层次的产品结构
工厂类可以有多个静态的工厂方法,分别用来生产不同的产品对象。
2多个工厂方法
分别负责创建不同的产品对象,比如java.text.DateFormat类是其子类的工厂类,而DateFormat类就是提供了多个静态工厂方法。
3抽象产品角色的省略
如果系统仅有一个具体产品角色的话,那么就可以省略掉抽象产品角色。
工厂角色与抽象角色合并
在有些情况下,工厂角色可以由抽象产品角色扮演。典型的应用就是java.text.DateFormat类,一个抽象产品类同时是子类的工厂
简单工厂模式的优点
核心式工厂类,工厂类决定在什么情况下创建哪一种产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅是“消费”产品。简单工厂模式通过这种做法实现了对责任的分割。
简单工厂模式的缺点
当产品类具有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变,是其缺点。
这个工厂类集中了所有产品创建逻辑,形成了一个无所不知的全能类(也称上帝类),如果此类出问题了,整个应用都受大影响。
当产品有多个接口时,判断在什么条件下创建什么产品类实例会很困难。
对于工厂来说,增加新的产品时一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户提供它们。换言之,接纳新的产品意味着修改这个工厂角色的源代码。简单工厂只在有限的程度上支持“开-闭”原则。
由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。这一缺点会在工厂方法模式中得到克服。
简单工厂模式在Java中的应用
DateFormat与简单工厂模式
工厂方法模式
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。下面是工厂方法模式的缩略类图
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做。这个核心工厂则变为抽象工厂角色,仅负责给出具工厂子类必须实现的接口,而不接触哪一产品创建的细节。
这种抽象的结果,使这种工厂方法模式可以用来允许系统不修改具体工厂角色的情况下引进新产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。
工厂方法模式的系统涉及到了以下角色:
抽象工厂角色:与应用程序无关,任何在模式中创建对象的工厂必须实现这个接口。
具体工厂角色:实现了抽象工厂接口的具体Java类,含有与引用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每个具体产品对象都是某个具体产品角色的实例。
抽象工厂(Abstract Factory)模式
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。
每个模式都是针对一定问题的解决方案。抽象工厂模式面对的问题是多产品等级结构的系统设计。
在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。
产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的CPU和ADM芯片的主板,组成一个家族。Intel的CPU和Intel芯片的主板,又组成一个家族。而这两个家族都来自于两个产品等级:CPU,主板。一个等级结构是由相同的结构的产品组成,示意图如下:
从上图可以看出,抽象工厂模式的每个工厂创造出来的都是一族产品,而不是一个或者一组。组是可以随意组合的!其实两个就这点点差别
在以下情况可以使用Abstract Factory模式
• 一个系统要独立于它的产品的创建、组合和表示时。
• 一个系统要由多个产品系列中的一个来配置时。
• 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
• 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
分享到:
相关推荐
在 C#中的委托和事件 一文的后半部分,我向大家讲述了Observer(观察者)模式,并使用委托和事件实现了这个模式。实际上,不使用委托和事件,一样可以实现Observer模式。在本文中,我将使用GOF的经典方式,再次实现一...
重温微积分 - 齐民友
我们的方法是代数的,仅基于对称原理。 我们分析的出发点是,对扩张算子的第一次校正是保形不变性,这意味着其形式固定为与高自旋电流的缩放尺寸相关的无限组系数。 可以使用众所周知的扰动结果来固定这些系数,...
重温 Iso-Recursive 子类型化(工件)抽象的这个包包含与论文“Revisiting Iso-Recursive Subtyping”相关的 Coq 公式。 本文档解释了如何运行 Coq 公式。入门我们强烈建议您通过opam2安装 Coq 证明助手。 安装 (>=...
本人深圳安卓开发程序猿一枚,希望能一起...最近重温了一下java的设计模式,练练手,java设计模式有23种,写了12种常用的设计模式,一些觉得用不上就没写,水平有限,有问题欢迎留言一起加油email:674928145@qq.com!
齐民优经典微积分教程,打开新世界的大门!!相对于枯燥无味的高数教材,这本书能带来不一样的启发和更为深入地理解
这一次重温一下《JavaScript设计模式与开发实践》,开篇为单例模式。 /** * pre 单例模式 * 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点 * 应用:单例模式是一种常用的模式,有一些对象我们...
经典重温C#开发------------------------------------------------------------------------------------------------------------------------------------------------
由 Hiemstra 和 Jones 开发的著名的 Hiemstra-Jones 检验(HJ 检验)在研究非线性因果关系方面发挥了重要作用。 在过去的二十年里,有许多基于这项开创性工作的应用和理论扩展。 然而,有几项工作指出,HJ 测试得到...
第1章 介绍1.1 对模式的十大误解1.2 观察第2章 运用模式进行设计2.1 基础2.2 孤儿、孤儿的收养以及代用品2.3 “但是应该如何引入代用品呢?”2.4 访问权限2.5 关于VISITOR的一些警告2.6 单用户文件系统的保护2.7 多...
专题研究:重温“信贷脉冲”-0217-浙商证券-11页.pdf
恐龙来袭-重温侏罗纪.ppt
20190407-国泰君安-通信设备及服务行业:重温传统视频会议的三生三世,揭示云视频行业的十里桃花.pdf
PPT模板-重温春夏秋冬(动态.dpt
第一分钟:委托 第二分钟:匿名方法 第三分钟:Lambda表达式 第四分钟:泛型委托 第五分钟:表达式树
由于手术传统上与高伤口并发症发生率相关,痛风性痛风石的治疗通常已从手术切除转向保守治疗。 但是仍然有一些患者因外科痛风性痛风石病而被切除,包括出于功能或美容目的。 我们描述了患有痛风性痛风石切除术的患者...
重温微积分》根据作者多年来为各种不同程度的大学生和研究生讲课及讨论班上报告的内容整理而成。第一章对极限理论的发展作了历史的回顾。以下六章分别讨论函数、微分学、积分学、傅里叶分析、实分析与点集拓扑学基础...
重温计算机的发展史-多图展示历史上各种各样的电脑.pdf
重温微积分前四章重排版齐民友.pdf