简单工厂,工厂方法和抽象工厂的区别总结(转)

最近这三个模式有点搞混了,而且网上也有类似情况。总结一下。

简单工厂:严格说并不是一个设计模式。简单工厂没有抽象类,只有一个具体工厂类如MyFactory,然后MyFactory里面有个工厂方法CreateProduct返回一个基类产品,具体返回什么具体实例通过传入参数然后用case判断。

用手机生产做个例子:

比如Nokia简单工厂就是只有NokiaFactory工厂类,工厂方法就是CreateNokiaPhone,参数是Nokia手机型号,根据不同型号创建不同的Nokia手机(使用case)。很明显的缺点就是Nokia每发明一个新型号的手机都需要修改简单工厂类(增加case判断),违反了封闭修改,开放扩展原则。

工厂方法:该模式有一个抽象基类和若干个派生的具体工厂类,基类定义了一个虚工厂方法返回指定产品类的基类,派生类需要实现该虚方法并创建具体产品类返回。注意工厂方法的每个具体工厂只负责返回一种产品类。

同样以手机生产做例子:

Nokia工厂方法模式有一个工厂基类NokiaFactory,注意此工厂和上面不一样,是抽象的。该类定义一个虚工厂方法CreateNokiaPhone,该方法返回NokiaPhone基类。然后不同型号的手机对应一个该型号的手机工厂,比如N97Factory,注意此工厂派生于NokiaFactory基类,N97Factory实现虚工厂方法,它返回值是具体的Nokia手机类,如new N97Phone。(注意N97Phone是NokiaPhone的派生类)这样的优点就是,新出一个Nokia手机型号,只需派生一个该型号的工厂而无需修改原来的代码。符合封闭修改,开放扩展原则。

抽象工厂:该模式和工厂方法模式很相似,也是一个抽象基类和若干个具体工厂类,不同的是抽象工厂的工厂基类定义了多个虚工厂方法,每个虚工厂方法负责返回一种产品,多个工厂方法返回多种产品,并且这些产品具有某些联系。

抽象工厂就不止生产Nokia手机了,还生产相关的周边产品,首先NokiaFactory基类会定义两个虚方法,一个是CreateNokiaPhone用来生产手机,另一个是CreateNokiaCharger用于生产对应型号的手机充电器(假定不同型号手机使用不同的充电器)。然后派生类N97Factory就要生产两种相关的产品,一个是N97Phone,还有一个是N97Charger,这两个对象是对应的关系,因此封装到抽象工厂来生产一系列相关的对象。

总结:用最简单的话来概括就是,简单工厂只有一个具体工厂类来创建一种基类的多个不同派生类,工厂方法就是有多个派生于一个基类的具体工厂类,每个具体工厂只生产一种基类的一个派生类,抽象工厂也是只有一个工厂基类,但是每个具体工厂生产多个相关基类的各一个派生类。

最近这三个模式有点搞混了,而且网上也有类似情况。总结一下。

简单工厂:严格说并不是一个设计模式。简单工厂没有抽象类,只有一个具体工厂类如MyFactory,然后MyFactory里面有个工厂方法CreateProduct返回一个基类产品,具体返回什么具体实例通过传入参数然后用case判断。

用手机生产做个例子:

比如Nokia简单工厂就是只有NokiaFactory工厂类,工厂方法就是CreateNokiaPhone,参数是Nokia手机型号,根据不同型号创建不同的Nokia手机(使用case)。很明显的缺点就是Nokia每发明一个新型号的手机都需要修改简单工厂类(增加case判断),违反了封闭修改,开放扩展原则。

工厂方法:该模式有一个抽象基类和若干个派生的具体工厂类,基类定义了一个虚工厂方法返回指定产品类的基类,派生类需要实现该虚方法并创建具体产品类返回。注意工厂方法的每个具体工厂只负责返回一种产品类。

同样以手机生产做例子:

Nokia工厂方法模式有一个工厂基类NokiaFactory,注意此工厂和上面不一样,是抽象的。该类定义一个虚工厂方法CreateNokiaPhone,该方法返回NokiaPhone基类。然后不同型号的手机对应一个该型号的手机工厂,比如N97Factory,注意此工厂派生于NokiaFactory基类,N97Factory实现虚工厂方法,它返回值是具体的Nokia手机类,如new N97Phone。(注意N97Phone是NokiaPhone的派生类)这样的优点就是,新出一个Nokia手机型号,只需派生一个该型号的工厂而无需修改原来的代码。符合封闭修改,开放扩展原则。

抽象工厂:该模式和工厂方法模式很相似,也是一个抽象基类和若干个具体工厂类,不同的是抽象工厂的工厂基类定义了多个虚工厂方法,每个虚工厂方法负责返回一种产品,多个工厂方法返回多种产品,并且这些产品具有某些联系。

抽象工厂就不止生产Nokia手机了,还生产相关的周边产品,首先NokiaFactory基类会定义两个虚方法,一个是CreateNokiaPhone用来生产手机,另一个是CreateNokiaCharger用于生产对应型号的手机充电器(假定不同型号手机使用不同的充电器)。然后派生类N97Factory就要生产两种相关的产品,一个是N97Phone,还有一个是N97Charger,这两个对象是对应的关系,因此封装到抽象工厂来生产一系列相关的对象。

总结:用最简单的话来概括就是,简单工厂只有一个具体工厂类来创建一种基类的多个不同派生类,工厂方法就是有多个派生于一个基类的具体工厂类,每个具体工厂只生产一种基类的一个派生类,抽象工厂也是只有一个工厂基类,但是每个具体工厂生产多个相关基类的各一个派生类。


相关内容

  • JAVA_程序设计模式之工厂模式[程序设计模式]结课论文
  • 河南理工大学 <程序设计模式>结课论文 运用.net设计 2013-2015学年第学期 论文题目java程序设计模式--工厂方法模式 :工厂方法模式(别名:虚拟构造) 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. Medi ...

  • 软件体系结构
  • 软件体系结构试题 一 .选择题 1.设计模式一般用来解决什么样的问题( a) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 2.下列属于面向对象基本原则的是( c ) A.继承 B.封装 C.里氏代换 D都不是 3.要依赖于抽象,不要依赖于具体.即针对接口编程 ...

  • 关于抽象和具体
  • 关于抽象和具体 什么是抽象呢?首先不必澄清什么是抽象,而从什么算抽象说起,稳定的.高层的就代表了抽象.就像一个公司,最好保证了高层的稳定,才能保证全局的发展.在进行系统设计时,稳定的抽象接口和高层逻辑,也代表了整个系统的稳定与柔性.兵熊熊一窝,将良良一窝,软件的构建也正如打仗,良好的设计都是自上而下 ...

  • 2011年机械专业实习总结
  • 实践目的:理论联系实际,在特定机械领域(风机)内了解理论知识在实际生产中的应用 实践时间:2010学年暑假 为期20天 实践地点:吉林省四平市中成风机工程有限公司(7月20日迁至辽宁 现辽宁金丰风机工程有限公司) 实践内容:风机相关的简单内容 y4-73-11no20f型锅炉离心引风机设计了解(图纸 ...

  • 机械实习工作总结
  • 与以往的师兄师姐们相比,我的这次暑期社会实践可以说幸运得多。在风机厂里我受到了不少照顾而不是像许多师兄师姐所说的那样到工厂里只是搬了一个月的砖头或者其他各样的体力活却没有学到什么更实际的东西。说起来,我想我的实践与其说起来是“实习”,更不如说是“学习”,因为我在学校所学到的知识无论是纯理论还是    ...

  • 物理抽象思维能力的培养
  • 根据中学生的生理和心理特点,他们对物理知识的理解,思维能力还处于一个初级阶段.在学习物理知识的过程中往往只是注重基础知识的学习,而不善于用科学的思维方法解决物理问题.只求一般性的感知过程,有时甚至不自觉地运用"想当然"的一些错误思维方法,造成学习物理上的思维障碍.教师在教学过程中 ...

  • 网页游戏开发入门教程
  • 网页游戏开发入门教程 网页, 入门, 教程, 游戏, 开发网页, 入门, 教程, 游戏, 开发 一.简单的程序框架. webgame程序构成: 三大部分. 第一是数据流程.第二是程序.第三是美术. 其中,数据流程包括了功能.也只有在功能中才能体现数据流程. 数据流程相当的麻烦,后面再讨论. 比如最简 ...

  • 面向对象三个基本特征
  • 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力: ...

  • 函数的概念说课稿
  • 函 数 的 概 念 山东沂源二中 石玉台 2011-09-26 各位专家.评委: 大家好! 我说课的内容是数学人教版普通高中新课程标准实验教科书必修1函数第一课时.我将从内容和内容解析.目标和目标解析.教学问题诊断分析.教法与学法.教学过程设计.目标检测设计.教学设计及预测说明及板书设计等八个方面来 ...