zoukankan      html  css  js  c++  java
  • 转:单例模式

    单例:在程序的整个进程中只会被实例化一次

    如:User user =new User();实例化一个User();的时候new User()是调用的 User类的 默认的公有构造函数:public User(){};

    一.想要整个程序只实例化一次这个User的话如:

    1.private static User_user=null; 定义一个私有的静态变量

    2.提供静态公有方法返回实例化对象

    复制代码
    public static GetUser(){ 
              if(User_user==null)
                {
                    User_user=new User();
                }
                return User_user;
            }
    复制代码

    3.调用:User user =User.GetUser();//进行返回单个实例

    4.多线程的时候需要加一把锁:

    复制代码
      private static object _lock =new object();//定义一个静态的对象最好是object类型
            public static GetUser(){ 
                if (User_user==null)
                {
                  lock (_lock)
                    {
                      if(User_user==null)
                        {
                            User_user=new User();
                        }
                    }
                }
                return User_user;
            }
    复制代码

    二.想要整个程序只实例化一次这个User的话如:

    复制代码
     private static User User_user =null;//提供私有静态实例对象
            static   User()//CLR运行的时候,第一次使用这个类之前,一定会而且只执行一次
            {
                User_user =new User();
            }
            public static GetUser()//提供公有静态方法供外部调用
            {
                return User_user;
            }
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    //双重锁机制
     
    namespace Singleton
    {
        public class Singleton
        {
            //定义一个私有的静态全局变量来保存该类的唯一实例
            private static Singleton singleton;
            //定义一个只读静态对象
            //且这个对象是在程序运行时创建的
            private static readonly object syncObject = new object();
     
            /// <summary>
            /// 构造函数必须是私有的
            /// 这样在外部便无法使用 new 来创建该类的实例
            /// </summary>
            private Singleton()
            { }
     
            /// <summary>
            /// 定义一个全局访问点
            /// 设置为静态方法
            /// 则在类的外部便无需实例化就可以调用该方法
            /// </summary>
            /// <returns></returns>
            public static Singleton GetInstance()
            {
                //这里可以保证只实例化一次
                //即在第一次调用时实例化
                //以后调用便不会再实例化
                //第一重 singleton == null
                if (singleton == null)
                {
                    lock (syncObject)
                    {
                        //第二重 singleton == null
                        if (singleton == null)
                        {
                            singleton = new Singleton();
                        }
                    }
                }
                return singleton;
            }
        }
    }

    转自https://www.cnblogs.com/ingstyle/p/6284967.html

  • 相关阅读:
    C语言多文件参数传递
    第十章 C++11新特性
    第九章 STL标准库(二)
    第八章 标准模板库STL(一)
    第七章 2.泛型编程(模板)
    第七章 1.输入输出与模板
    第六章 多态
    第五章 继承与派生
    第四章 运算符重载
    第三章 类与对象进阶
  • 原文地址:https://www.cnblogs.com/H1991/p/8377755.html
Copyright © 2011-2022 走看看