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






  • 相关阅读:
    测试驱动开发的意义何在
    Web自动化测试模式page object的小利器:gizmo
    在NANT使用Nunit2标签运行Nunit测试
    小试牛刀 Ruby on Rails
    敏捷回顾会议的思考
    ThoughtWorks技术校园行第二波 课程资料 CleanCode&DirtyCode
    从git merge 和 git rebase想到……
    Ruby中的深浅拷贝
    NUnit Extension小介绍
    如何写好的测试呢?
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/3330443.html
Copyright © 2020-2023  润新知