一、C#面向对象设计模式纵横谈(2-6)
2.Singleton单件(创建型模式)
模式分类
从目的来看:
创造型模式:负责对象创建。
构造型模式:处理类与对象间的组合。
行为型模式:类与对象交互中的职责分配
从范围来看:
类模式处理类与子类的静态关系
对象模式处理对象间的动态关系
动机:
对于一些特殊的类,必须保证它们在系统中只存在一个实例,以此来确保系统的高效性。
意图:
保证一个类仅有一个实例,并提供一个该实例的全局访问点。
结构:
注:静态的构造方法外部无法访问,该方法只可执行一次且优先执行,每当访问类的静态方法时先执行静态的构造方法
注:由于不能静态的构造方法进行操作,因此可将对静态构造方法的参数传递及处理剥离出来,单独作为一个功能实现
总结要点:
Singleton模式中的实例构造器可以设置为protected以允许子类派生
Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背
注:该接口可克隆对象实例
Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背
注:通过反序列化可获得对象实例,且此对象由于内存地址不同,Singleton模式约束不到该对象
Sinleton模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理
注:只有一个对象实例并不存在过多的消耗,一般不予理睬
不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象
注:例如A线程进入了判断语句但还没有创建对象实例,此时B线程也进入了判断语句,这时就会创建多个对象实例,不过可以通过锁来实现如上图所示
Singleton模式扩展:
将一个实例扩展到N个实例,例如对象池的实现。
注:例如数据库连接池节省资源
将new构造器的调用转移到其它类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。
注:这种对一个类的某个功能切割,适度分配使用,是设计模式的一个核心思想——对程序结构进行约束,规避风险
3.抽象工厂
主要内容:
讲述了程序由简单工厂模式到抽象工厂模式的变化过程,并根据不阶段不同的需求划分了工厂模式的几个阶段。在此非常有必要注意的是
应和倒置依赖原则配合使用应该根据实际情况选择不同阶段的工厂模式,复杂简练不一定适合小项目,有时会因为一些不必要的步骤降低程序效率。
核心思想:
封装变化点——哪里变化,封装哪里
根据变化点可以区分出好多的设计模型,抽象工厂就是对“对象创建”的封装
抽象工厂主要是面向接口编程,而不是依赖实现
动机:
采取封装机制降低客户程序与“一系列相互依赖的对象”的紧耦合关系
意图:
提供一个接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类
抽象工厂模式的几个要点:
如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的静态工厂完全可以。
“系列对象”指的是这些对象之间相互依赖、或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖。
Abstract Factory模式主要在于应对“新系列”的需求变动,其缺点在于难以应对“新对象”的需求变动。
注:就像上一点中游戏开发场景的例子一样。抽象工厂可以接受“道路”的“风格”变化,即本质不变,也就是接口提前确定了实现的规范。但是无法接受
新的事物的出现,即新的对象的出现。就像在游戏场景里增加一些动植物,这势必会带来一系列变化,这与抽象工厂的设计初衷相背。
Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化
4.Builder模式
动机:
为了解决“一个复杂对象”的各个部分应对需求改变的算法。
意图:
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
结构:
Builder模式的要点:
Builder模式主要用于“分步骤构建一个复杂的对象”。在其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
变化点在哪里,就封装哪里———Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。
Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。Builder模式通常和Composite模式组合使用。
5.Factory Method工厂方法
耦合关系:
程序的紧耦合像一张蜘蛛网,每一个节点变化,其他相关的节点都要相应改变,即所谓牵一发而动全身。
程序的松耦合像一棵树,枝干的变化不会引起主干的变动,即一些模块的变动不会影响其他模块。
动机:
在软件系统中,经常面临着“某个对象”的创建工作:由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口
这种需求的频繁变动和稳定的程序结构是如何办到的
意图:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
结构:
Factory Method模式的几个要点:
Factory Method模式主要哟关于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱
Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系
Factory Method模式解决”单个对象“的需求变化,Abstract Factory模式解决”系列对象“的需求变化,Builder模式解决“对象部分的需求变化
6.Prototype原型
动机:
在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口
如何实现隔离那些复杂对象,使得客户程序可以不随着需求的改变而改变
意图:
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
结构:
Prototype模式的几个要点:
Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。
Prototype模式对于“如何创建易变类的实体对象”采用“原型克隆”的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象————所需工作不仅仅是注册一个新类的对象(即原型),然后再任何需要的地方不断地Clone。
Prototype模式中的Clone方法可以利用.NET中的Object类的MemberwiseClone()方法或者序列化来实现深拷贝
二、UML_Concept
1.状态机视图
状态机视图:
状态机视图通过对每个类的对象的生命周期进行建模,描述了对象时间上的动态行为
状态机对类的对象的可能生命历史建模。状态机视图显示了一个对象如何根据当前状态对不同事件做出反应的动态行为。状态机视图主要由状态和 转换两种元素组成。
状态机视图作用:
状态机视图用于对系统的动态方面进行建模,适合描述一个对象在其生命周期中的各种状态及状态的转换。
事件:
事件是具有时间和空间位置的显著发生的某件事。它发生在时间点上;不具有持续时间。类比类指的是具有相同架构的所有对象,事件单独使用时指的是
所有具有相同一般形式事件个体的描述。
事件的种类:
状态:
状态描述了对象生命周期中的一段时间。它可以通过三个互补的方面来指定:某些性质上具有相似性的一系列对象值;对象等待某个或某些事件发生的一
段时间;对象执行某些正在进行活动的一段时间。状态可以具有名称,但一般该名称只是根据状态所对应的动作来描述。
状态指就某个特定类而言,对于发生的事件具有相同性质相应的一系列对象值。
复合状态:
简单状态无子结构,只有若干迁移和可能进入和退出动作。复合状态可以分解为连续的或并发的子状态。
迁移:
离开状态的迁移定义了该状态对象对某事件发生的响应。
状态机中,一系列状态由迁移来连接。尽管迁移连接两个状态,迁移由离开的状态来处理。当对象处于一个状态,它对于离开状态迁移的触发事件敏感。
迁移和隐式动作的种类:
2.活动视图
活动视图是用于显示执行某个计算过程中的运算活动的状态机的一种变形。活动图中的状态表示计算过程中所处的各种状态。
活动图:
活动图是活动视图的表示法。 活动图包含活动状态,活动图也可以包含动作状态,它与活动状态有些相似,但是它们是原子活动并且当它们处于活动状态时不允许发生转换。活动图可以包含并发线程的分叉控制
活动图能表示对象的值流和控制流。
基本元素: 活动、活动流、 分支、分劈和汇合、泳道、对象流,六大基本元素。
活动流: 活动流描写叙述活动之间的有向关系。
活动: 活动是活动图主要结点,用两边为弧的条形框表示。中间填写活动名。
分支: 分支表示活动流的分叉和合并。表示从一个活动依照某种条件转移到几个不同的活动。
分劈和汇合: 分劈和汇合表示并发的同步行为,用同步杆表示。
泳道: 泳道是活动图中的区域划分。每个泳道代表一个责任区域。一个泳道中包含一组相关活动。
对象流: 对象流反映活动与对象之间的依赖关系,表示对象活动的作用或活动对对象的影响,用依赖关系表示。对象流状态表示活动中输入或输出的对象。
3.交互视图:
交互视图描述了实现系统行为角色之间的消息交换序列。交互视图用侧重点不同的两种图来显示: 顺序图和协作图
顺序图:
顺序图中描述对象按照时间顺序的消息交换。顺序图表示了随时间安排的一系列消息。顺序图的一个用途是显示用例的行为序列。当行为被实现时,
每个顺序图中的消息同类的操作或状态机中迁移上的事件触发相一致。顺序图包含了4个元素:对象、生命线、消息、激活。
协作图:
协作图着重描述系统成分如何协同工作。协作对交互中存在意义的对象和链建模。协作图侧重对象之间的关系。