C#设计模式-创建型模式(转)
一、简单工厂模式
简单工厂模式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#设计模式-创建型模式(转)的更多相关文章
- java设计模式--创建型模式(一)
2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...
- C# 设计模式·创建型模式
面试问到这个··答不出来就是没有架构能力···这里学习一下···面试的时候直接让我说出26种设计模式··当时就懵逼了··我记得好像之前看的时候是23种的 还有3个是啥的··· 这里先列出几种创建型模式 ...
- 设计模式-创建型模式,python享元模式 、python单例模式(7)
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...
- 设计模式----创建型模式之工厂模式(FactoryPattern)
工厂模式主要分为三种简单工厂模式.工厂方法模式.抽象工厂模式三种.顾名思义,工厂主要是生产产品,作为顾客或者商家,我们不考虑工厂内部是怎么一个流程,我们要的是最终产品.将该种思路放在我们面向对象开发实 ...
- 【C#设计模式——创建型模式】简单工场模式
进入码农行列也有一年半载了,仍然感觉自己混混沌沌,无所事事,无所作为,,,想想都下气,下气归下气,仍要奋起潜行,像愤怒的小鸟一边又一遍的冲向猪头也好,像蜗牛一样往前蹭也罢,总之要有蚂蚁啃骨头的精神!! ...
- 【C#设计模式——创建型模式】抽象工厂模式
抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种 ...
- 【C#设计模式——创建型模式】工场方法模式
工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子 ...
- java设计模式--创建型模式--抽象工厂
什么是抽象工厂,再次学习. 抽象工厂 概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 1.一个系统要独立于它的产品的创建.组合和表示时. 2.一个系统要由多个产品系 ...
- 设计模式 -创建型模式 ,python工厂模式 抽象工厂模式(1)
工厂模式 import xml.etree.ElementTree as etree import json class JSONConnector: def __init__(self, filep ...
随机推荐
- 关于用POI和EXCEL交互的问题
废话不多说,直接通过例子来说明POI的使用: 1.一个创建excel并写入数据的小例子,参照网上的一个例子: public class CreateXL { /** * @param args */ ...
- Qt学习 之 Socket通信(世界上最简单的例子了)
最近写大作业用到Qt的Socket部分,网上关于这部分的资料都太过复杂,现在总结一下一些简单的应用.有机会可以给大家讲讲用Socket传送文件的代码. 这里主要讲解如何实现TCP和UDP的简单通信. ...
- java学习之数组(一)【内存】
在java语言当中,为了更方便多个数据的管理,这里提供数组. 比如说,现在我们有一组数据,7,8,9,9,为了保存这四个数据,我们分别要定义变量来保存,少了还好说.但是假如,有100多个数据呢,我们一 ...
- Powerful Regex
Online test Regex http://rubular.com An example src="http:\/\/localhost:3000\/preveiw-tool\/iph ...
- Binary Tree Inorder Traversal ——LeetCode
Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...
- 《精通CSS:高级Web标准解决方案》学习笔记(上)
鉴于国产CSS书籍基本都是辣鸡的现状,我在半年前动用某工作室的购书资金采购了一些技术书籍,这本广受好评的<精通CSS>也在其中.但是在阅读过后我深深的感觉到,如果说CSS本来已经是一种很琐 ...
- FATE(完全背包)
/* http://acm.hdu.edu.cn/showproblem.php?pid=2159 分析: 和普通的完全背包没有什么太大的区别 但是题目中给出了限制最多可杀s个怪 用二维数组dp[i] ...
- 双有序队列算法——处理哈夫曼K叉树的高效算法
算法介绍: 哈夫曼树的思路及实现众所周知,大部分是用堆来维护和实现,这种思路比较清晰,在K比较小的时候处理较快(具体例子接下来再说),而且编程复杂度不是很高,利于应用.但是,其所用的数据结构是树,是在 ...
- C++设计模式---职责链模式
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿这条链传递该请求,直到有一个对象处理它为止. 这里发出这个请求的客户端并不知道这当中的哪一 ...
- HashMap,TreeMap,LinkedHashMap学习
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复.Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快 ...