一、简单工厂模式

简单工厂模式Simple Factory,又称静态工厂方法模式。它是类的创建模式。是由一个工厂对象决定创建出哪一种产品类的实例,是不同的工厂方法模式的一个特殊实现。

优点:

u 模式的核心是工厂类,该类中含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。

u 简单工厂模式实现了对责任的分割。

缺点:

u 当产品类有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变。

u 模式中工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类。

u 将多个创建逻辑放在一个类中,当产品类有不同接口种类时,工厂类需要判断在什么时候创建某种产品,使得系统在将来进行功能扩展时较为困难。

u 该模式采用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。

二、工厂方法模式

工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

优点:

u 多态性:客户代码可以做到与特定应用无关,适用于任何实体类。

u 子类提供挂钩。基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。-- 加一层间接性,增加了灵活性

u 连接并行的类层次结构。

u 良好的封装性,代码结构清晰。

u 扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”。

u 屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。

u 典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。

缺点:

u 需要Creator和相应的子类作为factory method的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。

三、抽象工厂模式

抽象工厂模式Abstract Factory,又称工具箱模式。它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 – 客户端不必指定产品的具体类型,创建多个产品族中的产品对象。

优点:

u 分离了具体的类,一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离

易于交换产品系列,只需改变具体的工厂就可以使用不同的产品配置。

u 有利于产品的一致性,当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象。

缺点:

u 难以支持新的产品等级结构,支持新的产品等级结构就要扩展抽象工厂接口。

四、单例模式

单例模式Singleton:一个类仅有一个实例,自行实例化并向整个系统提供一个访问它的全局访问点。

优点:

u 跨平台:使用合适的中间件,可以把singleton模式扩展为跨多个JVM和多个计算机工作。

u 适用于任何类:只需把一个类的构造函数变成私有的,并且在其中增加相应的静态函数和变量,就可以把这个类变为singleton。

u 可以通过派生创建:给定一个类,可以创建它的一个singleton子类。

u 延迟求值:如果singleton从未使用过,那么就绝不会创建它。

缺点:

u 摧毁方法未定义:没有好的方法去摧毁一个singleton,或者解除其责任。

u 不能继承:从singleton派生的类并不是singleton。如果要使其成为singleton,必须要增加所需的静态函数和变量。

u 效率问题:每次调用instance方法都会执行if语句,多余。

u 不透明性: singleton的使用者知道它们正在使用一个singleton ,因为它们必须要调用instance方法。

五、多例模式

多例模式Multiton:多例模式为对象的创建模式。多例模式中的多例类可以有多个实例,而且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。

特点:

u 多例类可有多个实例。

u 多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。

六、建造模式

建造模式Builder:建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

优点:

u 建造模式的使用使得产品的内部表象可以独立地变化。使用建造模式可以使客户端不必知道产品内部组成的细节。

u 每一个Builder都相对独立,而与其他的Builder无关。

u 模式所建造的最终产品更易于控制。

缺点:

u 创建者模式比较符合产品差别不大的对象的创建,如果差别很大,就会导致非常多的具体的创建者,这时候最好结合工厂方法模式。

七、原型模式

原型模式 Prototype :用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

优点:

u 原型模式允许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此增加新产品对整个结构没有影响。

u 原型模式提供简化的创建结构。工厂方法常需要有一个与产品类相同的等级结构,而原型模式不需要。对Java设计者,原型模式有其特有方便之处,Java语言已将原型模式设计到语言模型里。如果善于利用原型模式和Java语言特点,可事半功倍。

u 具有给一个应用软件加载新功能的能力。如:一个分析web服务器的记录文件的应用软件,针对每一种记录文件格式,都可以由一个相应的“格式类”负责。如果出现了应用软件所不支持的新的web服务器,只需提供一个格式类的克隆,并在客户端登记即可,不必给每个软件的用户提供一个全新的软件包。

u 产品类不需要非得有任何事先确定的等级结构,因为原型模式适用于任何的等级结构。

缺点:

u 每一个类必须配备一个克隆方法。

u 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

八、相关性

几种模式的相关性:

u 简单工厂是基础。

u 工厂方法模式是简单工厂模式的进一步抽象和推广,定义了工厂接口,将实际的创建工作推迟到子类中,如果只有一个具体工厂类,可以改造为简单工厂模式。

u 抽象工厂模式是对象的创建模式,是工厂方法模式的进一步推广,抽象工厂模式经常用工厂方法来实现。抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。

u 工厂方法模式针对的是一个产品等级结构。抽象工厂模式需要面对多个产品等级结构。

u 单例模式有比较强烈的物理意义,可以用在许多细微的地方,不一定与类层次关联,与其他创建型模式并不矛盾,可以用单例模式来实现其他模式中的对象,如抽象工厂模式、建造模式和原型模式等。

u 多例模式是单例模式的自然推广。

u 建造模式与抽象工厂模式相比,都可以创建复杂对象,但建造模式着重于一步步构造一个复杂对象,抽象工厂模式着重于一系列的产品对象,相应地,建造模式是在最后的一步返回产品,抽象工厂模式的产品是立即返回的。可以搭配使用抽象工厂模式和建造模式,客户端通过调用建造模式,间接地调用抽象工厂模式的工厂角色,工厂模式返还不同产品族的零件,建造模式把它们组装起来。

u 原型模式与抽象工厂模式竞争,根据应用需求进行取舍。

C#设计模式-创建型模式(转)的更多相关文章

  1. java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  2. C# 设计模式·创建型模式

    面试问到这个··答不出来就是没有架构能力···这里学习一下···面试的时候直接让我说出26种设计模式··当时就懵逼了··我记得好像之前看的时候是23种的 还有3个是啥的··· 这里先列出几种创建型模式 ...

  3. 设计模式-创建型模式,python享元模式 、python单例模式(7)

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...

  4. 设计模式----创建型模式之工厂模式(FactoryPattern)

    工厂模式主要分为三种简单工厂模式.工厂方法模式.抽象工厂模式三种.顾名思义,工厂主要是生产产品,作为顾客或者商家,我们不考虑工厂内部是怎么一个流程,我们要的是最终产品.将该种思路放在我们面向对象开发实 ...

  5. 【C#设计模式——创建型模式】简单工场模式

    进入码农行列也有一年半载了,仍然感觉自己混混沌沌,无所事事,无所作为,,,想想都下气,下气归下气,仍要奋起潜行,像愤怒的小鸟一边又一遍的冲向猪头也好,像蜗牛一样往前蹭也罢,总之要有蚂蚁啃骨头的精神!! ...

  6. 【C#设计模式——创建型模式】抽象工厂模式

    抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种 ...

  7. 【C#设计模式——创建型模式】工场方法模式

    工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子 ...

  8. java设计模式--创建型模式--抽象工厂

    什么是抽象工厂,再次学习. 抽象工厂 概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 1.一个系统要独立于它的产品的创建.组合和表示时. 2.一个系统要由多个产品系 ...

  9. 设计模式 -创建型模式 ,python工厂模式 抽象工厂模式(1)

    工厂模式 import xml.etree.ElementTree as etree import json class JSONConnector: def __init__(self, filep ...

随机推荐

  1. Dungeon Master(poj 2251)

    Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is co ...

  2. sphinx插入css

    使用role指令达到目的. We can put following lines at the beginning of our RST file to specify its style. .. r ...

  3. 【HDOJ】1401 Solitaire

    双向BFS+状态压缩. /* 1401 */ #include <iostream> #include <queue> #include <map> #includ ...

  4. Linux下常见权限操作相关命令

    ls -alls -ld chmod 700 sys_config chmod 700 sys_objschmod 4711 objget su test_setuid -c "./objp ...

  5. AndroidStudio SVN检出

    版本管理是每个项目的必经之路,很多的ADT都会集成版本管理插件.AS也同样可以集成GITHUB和SVN插件.github对项目有一定的限制,而SVN就比较开放了,所以我们在用AS开发的时候一般用SVN ...

  6. 动态规划(方案还原):SGU 104 Little shop of flowers

    花店橱窗布置问题 时间限制:3000 ms 问题描述(Problem)    假设你想以最美观的方式布置花店的橱窗,你有F束花,每束花的品种都不一样,同时,你至少有同样数量的花瓶,被按顺序摆成一行.花 ...

  7. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)

      HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...

  8. 【动态规划】HDU 5791 Two

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5791 题目大意: A,B两个数列,问A的子集和B的子集相等的子集对数.子集内顺序按照数列顺序,相同的 ...

  9. javax.el.PropertyNotFoundException错误

    在J2EE项目的开发过程中,遇到了这个问题,报错如下: 错误原因为在我model里的Person类里定义了一个Name属性,但是读取属性的getter方法的,一般按照属性首字母小写来处理,所以把Nam ...

  10. 安装 macbook 双系统( OS X 和 Ubuntu )

    打算 macbook 上面多安装一个 ubuntu 系统来用下.流程大致下面几步: 1. 备份重要资料 2. 划分硬盘区域用于安装 ubuntu 3. 下载 ubuntu ISO 文件,并刻录到 U ...