1.设计原则和单例模式

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,使它有少数几个实例,这样做是允许的而且是有意义的。






原文地址:https://www.cnblogs.com/yxlblogs/p/3330443.html