• 1.单例模式


    1.定义

    Ensure a class has only one instance,and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)

    2.模式讲解

    (1)类图

    (2)单例模式通用代码

     1 public class Singleton
     2 {
     3     private static Singleton singleton = new Singleton();
     4 
     5     private Singleton()
     6     {}
     7 
     8     public static Singleton GetSingleton()
     9     {
    10         return singleton;
    11     }
    12 }

    3.单例模式的多种实现方式

    (1)简单的实现

        public sealed class Singleton
        {
            private static Singleton _instance = null;
    
            private Singleton()
            {
            }
    
            public static Singleton Instance
            {
                get
                {
                    if (_instance == null)
                    {
                        _instance = new Singleton();
                    }
                    return _instance;
                }
            }
        }

    缺点:这种方式的实现对于线程来说并不是安全的,因为在多线程的环境下有可能得到Singleton类的多个实例。

    优点:直到对象要求产生一个实例才执行实例化;这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的 singleton

    (2)安全的线程

        public sealed class Singleton
        {
            private static Singleton _instance = null;
    
            private static readonly Object O = new object();
    
            private Singleton()
            {
            }
    
            public static Singleton Instance
            {
                get
                {
                    lock (O)
                    {
                        if (_instance == null)
                        {
                            _instance = new Singleton();
                        }
                        return _instance;
                    }
                }
            }
        }

    优点:这种方式的实现对于线程来说是安全的。我们首先创建了一个进程辅助对象,线程在进入时先对辅助对象加锁然后再检测对象是否被创建,这样可以确保只有一个实例被创建,因为在同一个时刻加了锁的那部分程序只有一个线程可以进入。这种情况下,对象实例由最先进入的那个线程创建,后来的线程在进入时(instence == null)为假,不会再去创建对象实例了。

    缺点:这种实现方式增加了额外的开销,损失了性能。

    (3)静态初始化,饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)

        public sealed class Singleton
        {
            private static readonly Singleton singleton = new Singleton();
    
            private Singleton()
            { }
    
            public static Singleton GetSingleton()
            {
                return singleton;
            }
        }
  • 相关阅读:
    PHPStorm 2018 的安装 汉化 与使用
    aptana怎么显示空格 tab和回车等
    学习linux—— VMware 安装 ubantu 18 如何连接wifi
    [转]MAC系统下Sublime Text3 配置Python3详细教程(亲测有效)
    如何利用sql 读取辅表的最大max 和第二最大max。。。。
    利用PHPExcel导出excel 以及利用js导出excel
    yii2.0如何优化路由
    教女朋友写第一个php,php环境配置
    js 删除数组中的某一个内容
    vue 路由守卫是否携带token
  • 原文地址:https://www.cnblogs.com/JustYong/p/4596536.html
Copyright © 2020-2023  润新知