[设计模式]单件模式(Singleton Pattern)

《Head First 设计模式》的读书笔记

单件模式Singleton Pattern

 

有的时候,你可能会希望有这样一个类,它只能允许最多有一个实例存在于这个世界上,这个实例,是独一无二的存在。

这个时候,单件模式(singleton pattern)便应运而生

 

要完成这一切最重要的一环,其实就是将这个类的构造方法设为私有。

 

代码大意如下:

 单件类:

    class SingleOnly
    {
        private static SingleOnly instance;//用来存放该类的实例

        private SingleOnly()//被设为私有的构造函数,不能被外部调用,只能被内部方法调用。在这里,唯一的创造点就是GetInstance()方法
        {
        }

        
        public static SingleOnly GetInstance()//获得SingleOnly的实例只有这一个方法,这个方法就是该类型唯一的创造点。
        {
            if (SingleOnly.instance == null)
            {
                SingleOnly.instance = new SingleOnly();//此方法虽然是static的,但是可以调用非static的构造方法.
                Console.WriteLine("我被赋予了独一无二的生命!!!");
            }
            else
            {
                Console.WriteLine("我又被召唤了出来");
            }
            return SingleOnly.instance;
        }        
    }

 主体类:

    class Program
    {
        static void Main(string[] args)
        {            
            SingleOnly instance1 = SingleOnly.GetInstance();//想获取SingleOnly的实例,只有这一条办法
            SingleOnly instance2 = SingleOnly.GetInstance();

            if( instance1 == instance2)
            {
                Console.WriteLine("相同实例");
            }
        }
    }

最后输出的结果为:

我被赋予了独一无二的生命!!!                     
我又被召唤了出来                                    
相同实例                                               

 

!值得注意的是,如果将上面的这种方法直接用在多线程的环境中显然是不安全的,这时候就需要添加一些互斥独占方法的标识符。

 

Tips:

这里有一个小技巧可以分享一下,还有一种情况也可以将构造函数设置为private。

当一个类中所有的方法都是静态的时候,此时这个类的实例将失去价值,那么就可以将其构造方法设置为private以免被他人误初始化

posted @ 2012-06-23 21:28  叫我学徒  阅读(248)  评论(0编辑  收藏  举报