深入浅出设计模式-005:单例模式(Singleton Pattern)

    技术2025-01-08  50

    深入浅出设计模式-005:单例模式(Singleton Pattern)

    一:单例模式,确保一个类只有一个实例,并提供一个全局访问点    单例模式确保程序中只有一个实例    单例模式也提供访问这个实例的全局点    确定在性能和资源上的限制,然后小心地选择适当的方案实现单例,以解决多线程的问题。

        public sealed class Singleton1    {        //缺点:如果同时有两个线程去判断(instance == null),并且得到的结果为真,        //      这时两个线程都会创建类Singleton的实例,这样就违背了Singleton模式的原则。        //优点:由于实例是在 Instance 属性方法内部创建的,因此类可以使用附加功能,即使它可能引入不想要的依赖性。         //      直到对象要求产生一个实例才执行实例化;        //      这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的 singleton。         private static Singleton1 uniqueInstance = null;        private Singleton1() { }

            public static Singleton1 getInstance()        {            if (uniqueInstance == null)                uniqueInstance = new Singleton1();            return uniqueInstance;        }    }    public sealed class Singleton2    {        //优点:线程安全        //缺点:每次执行操作时,都需要同步,而事实上只需要第一次构建时同步即可        private static Singleton2 uniqueInstance = null;        private static Object syncRoot = new Object();        private Singleton2() { }

            public static Singleton2 getInstance()        {            lock (syncRoot) ;            if (uniqueInstance == null)            {                uniqueInstance = new Singleton2();            }            return uniqueInstance;        }    }    public sealed class Singleton3    {        //优点:线程安全,采用双重加锁减少每次都同步的确定        //缺点:无法实现延迟初始化。        private volatile static Singleton3 uniqueInstance = null;        private static Object syncRoot = new Object();        private Singleton3() { }

            public static Singleton3 getInstance()        {            if (uniqueInstance == null)            {                lock (syncRoot) ;                if (uniqueInstance == null)                    uniqueInstance = new Singleton3();            }            return uniqueInstance;        }    }    public sealed class Singleton4    {        //优点:延迟加载,线程安全        //缺点:对实例化机制的控制权较少。        private static readonly Singleton4 uniqueInstance = new Singleton4();        static Singleton4() { }        private Singleton4() { }

            public static Singleton4 getInstance()        {            return uniqueInstance;        }    }

        public sealed class Singleton5    {        //静态构造函数,在调用时,和静态函数成员类似,都会被优先调用        //缺点:线程不安全        private static Singleton5 uniqueInstance = null;        static Singleton5()        {            uniqueInstance = new Singleton5();        }

            private Singleton5() { }        public static Singleton5 getInstance()        {            return uniqueInstance;        }    }    public sealed class Singleton6    {        //静态构造函数,在调用时,和静态函数成员类似,都会被优先调用        //线程安全        private static Singleton6 uniqueInstance = null;        private static System.Threading.Mutex mutex;        static Singleton6()        {            uniqueInstance = new Singleton6();            mutex = new System.Threading.Mutex();        }

            private Singleton6() { }

            public static Singleton6 getInstance()        {            mutex.WaitOne();            return uniqueInstance;        }        public static void Release()        {            mutex.ReleaseMutex();        }    }    class Program    {        static void Main(string[] args)        {            Singleton1.getInstance();            Singleton2.getInstance();            Singleton3.getInstance();            Singleton4.getInstance();            Singleton5.getInstance();            Singleton6.getInstance();        }    }

    最新回复(0)