zoukankan      html  css  js  c++  java
  • 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;
            }
        }
  • 相关阅读:
    PAT (Basic Level) Practise 1013 数素数
    PAT (Basic Level) Practise 1014 福尔摩斯的约会
    codeforces 814B.An express train to reveries 解题报告
    KMP算法
    rsync工具
    codeforces 777C.Alyona and Spreadsheet 解题报告
    codeforces 798C.Mike and gcd problem 解题报告
    nginx + tomcat多实例
    MongoDB副本集
    指针的艺术(转载)
  • 原文地址:https://www.cnblogs.com/JustYong/p/4596536.html
Copyright © 2011-2022 走看看