1.从设计原则到设计模式
(1)针对接口编程,而不是针对实现编程
客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望的接口
(2)优先使用对象组合,而不是类继承
对象尽量使用接口,而不是一味的继承,因为这样会破坏封装性
(3)封装变化点
将变化的部分进行封装,这样不会对其他的部分有影响
(4)使用重构得到模式
一上来就使用设计模式是对设计模式的最大误用。
2.具体的设计原则
(1)单一职责原则
一个类应该仅有一个引起它变化的原因
(2)开放封闭原则
类模块应该是可扩展的,但是不可修改(对扩展开放,对更改封闭),简单的说就是不修改原来的类或方法,而是增加类或者方法
(3)Liskov 替换原则(里氏替换原则LSP)
子类必须能够替换它们的基类
(4)依赖倒置原则
高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于实现细节,实现细节应该依赖于抽象。
(5)接口隔离原则
尽量应用专门的接口,而不是单一的总接口
(6)合成/聚合复用原则
整体和部分的关系,而不是使用继承,继承不能使用太深,合成方式较继承方式耦合更松散,
(7)迪米特法则
又叫最小知识原则,,指软件实体应该尽可能少的和其他软件实体发生相互作用。尽量和其他的少引用
3.模式分类
从目的来看:
(1)创建型模式:负责对象创建。
(2)结构型模式:处理类于对象间的组合。
(3)行为型模式:类于对象交互中的职责分配。
从范围来看:
(1)类模式处理类与子类的静态关系。
(2)对象模式处理对象间的动态关系。
4.Singleton单例(单件)模式(创建型模式)
1.什么时候使用单例模式?
保证一个类仅有一个实例,并提供一个该实例的全局访问点。一般用单例模式来记录系统日志Log
2.通用的单例模式使用代码
单线程
/// <summary> /// 简单实现 /// 对于线程来说不安全 /// 单线程中已满足要求 /// 优点: /// 由于实例是在 Instance 属性方法内部创建的,因此类可以使用附加功能 /// 直到对象要求产生一个实例才执行实例化;这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的 singleton。 /// </summary> public sealed class Singleton { private static Singleton singletion = null; private Singleton() { } public static Singleton Instance { get { if (singletion==null) { singletion = new Singleton(); } return singletion; } } }
多线程
/// <summary> ///多线程安全 ///线程不是每次都加锁 ///允许实例化延迟到第一次访问对象时发生 /// </summary> public sealed class Singleton { private static Singleton singletion = null; private static readonly object padlock = new object(); private Singleton() { } public static Singleton Instance { get { if (singletion==null) { lock (padlock) { if (singletion == null) { singletion = new Singleton(); } } } return singletion; } } }
.net推荐使用的方式
/// <summary> ///静态初始化 ///依赖公共语言运行库负责处理变量初始化 ///公共静态属性为访问实例提供了一个全局访问点 ///对实例化机制的控制权较少(.NET代为实现) ///静态初始化是在 .NET 中实现 Singleton 的首选方法 ///初始化工作由Nested类的一个静态成员来完成,这样就实现了延迟初始化 /// </summary> public sealed class Singleton { private Singleton() { } public static Singleton Instance { get { return Nested.singletion; } } private class Nested { internal static readonly Singleton singletion = null; static Nested() { singletion = new Singleton(); } } }
3.使用注意事项
Singleton模式中的实例构造器可以设置为protected以允许子类派生。
Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
4.总结
Singleton模式是限制而不是改进类的创建。
理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”。
可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。