设计模式(一)单例模式:创建模式

szlblog 2018-01-11 原文

设计模式(一)单例模式:创建模式

先聊一下关于设计的几个原则
(1)单一原则(SRP):一个类应该仅有一个引起它变化的原因 :意思就是 (一个类,最好只负责一件事情,并且只有一个引起它变化的原因
(2)开闭原则(OCP): 应该对扩展开放,但是对修改关闭:意思是(模块通过扩展的方式去应对需求的变化,应该尽量在不修改源代码的基础上面扩展)
(3)依赖倒置原则(DIP):高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
         高层模块不应该直接依赖于底层模块的具体实现,而应该依赖于底层的抽象。模块间的依赖是通过抽象发生,不发生直接的依赖关系,依赖关系是通过接口或抽象类为中间件产生的。
(4)LisKov 替换原则(LSP)(里式替换原则) :子类对象可以替换父类对象的位置    这里如果想了解的更清晰的话 了解一下 (斜变/逆变)
(5) 接口的隔离原则(IPS):(1)是不应该强行要求客户端依赖于它们不用的接口;(2)是类之间的依赖应该建立在最小的接口上面。简单点说,客户端需要什么功能,就提供什么接口,对于客户端不需要的接口不应该强行要求其依赖;类之间的依赖应该建立在最小的接口上面,这里最小的粒度取决于单一职责原则的划分。
      还有其他 理解不深可就没敢说出来.

设计模式(1)单例模式(创建模式)

注意事项:

1.  允许子类派生
2. 不要实现 icloneable 接口  https://msdn.microsoft.com/zh-cn/library/system.icloneable.aspx 这个接口继承后可能会导致生成多个示例,违背了模式的原本意思
3. 不要序列化  理由同上
4. 不要再多线程下使用,(如果需要再多线程下使用的话见下面举例)

单利模式作用
 (1)确保一个类只有一个实例;

 (2)提供一个访问它的全局访问点

利用代码实现一个简洁的单例

 class SingletonClass
    {
        private static volatile SingletonClass instance = new SingletonClass();
        //私有的构造函数
        private SingletonClass()
        {
        }
        public static SingletonClass Newinstance
        {
            get
            {
                return instance;
            }
        }
    }

           这个类在被调用时 SingletonClass.Newinstance();

           优点:(1)确保一个类只有一个实例;

                     (2)提供一个访问它的全局访问点

           缺点:(多线程环境下就会破坏单利的初衷:会形成多个类的实例)

 

利用代码实现  在多线程环境下的单例

  通过双重判断 对资源进行锁定 确保再多线程环境下确保只有一个实例

  注意:代码注释

    class multithreading_Singleton
    {
        //为了以防万一的出现
        //volatile  关键字作用  当编译编译过程中  会对代码进行细微的调整,为了防止代码发生改变保证代码原意不变  多线程使用时有可能会导致 顺序发生改变 导致多个实例的发生       
        private static volatile multithreading_Singleton example = null;
        //声明一个资源锁
        private static object Lock = new object();
        //私有的构造函数
        private multithreading_Singleton()
        {

        }
        public static multithreading_Singleton Newinstance
        {
            get
            {
                //保证多个线程不会同时进入判断
                if (example == null)
                {
                    //对资源进行锁定  Lock 只要是object 下的类型就OK了
                    lock (Lock)
                    {
                        if (example == null)
                        {
                            example = new multithreading_Singleton();
                        }
                    }
                }
                return example;
            }
        }
    }

利用代码实现   单线程多线程通用单例

优点:静态构造函数 在调用时 只会产生一个,系统在默认的情况下仿佛已经对资源加过锁
缺点是不能带参数   
原因: (1):静态函数不允许不允许出现访问修饰符
            (2):静态构造函数必须无参数

    class SingletonCurrency
    {
        public static readonly SingletonCurrency example = new SingletonCurrency();

        private SingletonCurrency() { }
    }

         下面代码是读上面代码的解释代码:

              public static readonly SingletonCurrency example = new SingletonCurrency();  等同于省略了静态构造函数,这里的省略不是编译上的省略而是代码上的省略,在系统编译时还是会有一个静态构造的

 class SingletonCurrency_Remark 
    {
        public static readonly SingletonCurrency_Remark example ;
        /// <summary>
        /// 静态构造函数
        /// </summary>
        static SingletonCurrency_Remark()
        {
            example = new SingletonCurrency_Remark();
        }
        private SingletonCurrency_Remark() { }
    }

 

推荐书籍     大话设计模式 (中文)   《Head First 设计模式》

希望大家指出不足之处  谢谢

发表于 2018-01-11 20:40 乐途 阅读() 评论() 编辑 收藏

 

版权声明:本文为szlblog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/szlblog/p/8270491.html

设计模式(一)单例模式:创建模式的更多相关文章

  1. Python 设计模式

    【设计目的:】  目标:维护性。 标准:扩展性、重用性、高内聚、低耦合。 原则:7 大基本原则。 模式:23 […]...

  2. JAVA设计模式-动态代理(Proxy)示例及说明

    在Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析文章的最后部分,我们提到了动态代理的概 […]...

  3. 跟我一起学习设计模式(一)总览

    Dessign Pattern Overview 目录 Dessign Pattern Overview Ov […]...

  4. 您的单例模式,真的单例吗?

    单例模式,大家恐怕再熟悉不过了,但是,咱们在使用这些方式实现单例模式时,程序中就真的会只有一个实例吗?实际上, […]...

  5. 单例模式

    目录 简介 懒汉式 饿汉式 静态内部类 枚举 序言:在写单例模式之前,我知道网上有一堆博客已经写过单例模式了, […]...

  6. 单例模式

    目录 饿汉式单例 懒汉式单例 DCL+ volatile DCL + final 静态内部类实现单例模式 饿汉 […]...

  7. 设计模式——建造者模式

    引言 之前在家看两个小外甥玩轨道车,拆开包装,一堆小零件,兄弟两一个拼桥梁、弯道、路标,一个装车、搭立交、组装 […]...

  8. OOAD-4 面对对象设计七原则–里氏替换原则

    OOAD-4 面对对象设计七原则–里氏替换原则 里氏替换原则的定义   里氏替换原则(Liskov […]...

随机推荐

  1. 前端框架VUE—-导入Bootstrap以及jQuery的两种方式 Vue引入bootstrap主要有两种方法

    方法一:在main.js中引入,此方法导入的bootstrap中对于html,body的一些预设置的css样式 […]...

  2. TouchPad应用更新:通过Siri控制Mac和PC – java环境变量

    TouchPad应用更新:通过Siri控制Mac和PC 2011-11-30 17:17  java环境变量  […]...

  3. 一个完整的jmeter APP登录接口测试实例

    最终效果: 知识点: 通过HTTP信息头管理器, 正则表达式提取器 提取登录要用的token,memcard, […]...

  4. 对数据挖掘的理解和项目流程 – 小糖球ai大萝卜

    对数据挖掘的理解和项目流程 数据挖掘 14年毕业,那会进了现在的公司,做当时很红火的数据挖掘。在有些人眼里我们 […]...

  5. python-异常处理、元类

    一、异常处理 1.异常处理介绍:   异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常没有被应用 […]...

  6. 用Ps按比例缩小图片整体的尺寸 – Charles.

    用Ps按比例缩小图片整体的尺寸 有时候前端拿到的PSD源文件很大,可能有几百MB甚至上G,可以按整体比例缩小尺 […]...

  7. 变异的一生 | all about variant

    目录 变异的意义 变异的分类 突变的类型 变异对生命活动的影响 研究得较为透彻的一些变异 变异的未来研究趋势 […]...

  8. 简单的抠图方法

    套索工具组 快捷键 L;同组工具切换Shift +L 套索工具 也可进行布尔运算,按Ctrl键添加选区,按al […]...

展开目录

目录导航