转:单例模式

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

如: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

posted on 2018-01-29 15:55  大山的  阅读(79)  评论(0编辑  收藏  举报

导航