Head First设计模式之单例模式

简介: 一、定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。   Singleton模式中的实例构造器可以设置为protected以允许子类派生。

一、定义

保证一个类仅有一个实例,并提供一个访问它的全局访问点。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

 

  • Singleton模式中的实例构造器可以设置为protected以允许子类派生。
  • Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
  • Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样跟Singleton模式的初衷违背。
  • Singleton模式只考虑到了对象创建的管理,并没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理。

 

二、结构

创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。

SingleObject 类提供了一个静态方法,供外界获取它的静态实例。

三、适用场景

 1、要求生产唯一序列号。

2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

 

四、优缺点

优点: 

1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

2、避免对资源的多重占用(比如写文件操作)。

缺点:

没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

五、实现

 单例模式的实现有多种方式

1、线程不安全 

    public sealed class Singleton
    {
        public int Count { get; set; }

        private static Singleton instance = null;

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }

        private Singleton()
        {
            Count = DateTime.Now.Millisecond; 
        }
    }

    public class SimpleSingleton
    {
        private SimpleSingleton() { }
        public static readonly SimpleSingleton instance = new SimpleSingleton();
    }

 

说明:SimpleSingleton是 Singleton 的简化版,它利用.NET的特性写的,其实和Singleton 一样

 

2.线程安全 

    /// <summary>
    /// 单例-线程安全
    /// </summary>
    public sealed class SafeSingleton
    {
        public int Count { get; set; }

        private static SafeSingleton instance = null;

        private static readonly object safeLock = new object();

        public static SafeSingleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (safeLock)
                    {
                        if (instance == null)
                        {
                            instance = new SafeSingleton();
                        }
                    }
                }
                return instance;
            }
        }

        private SafeSingleton()
        {
            Count = DateTime.Now.Millisecond;
        }
    } 

 

3.单例测试

 

class Program
    { 
        static void Main(string[] args)
        {
            SayName();
            SayNewName();
            Thread.Sleep(1000);
        } 

        private static async Task SayName()
        {
            await Task.Run(() =>
            {
                var s = Singleton.Instance;
                Console.WriteLine("count:" + s.Count);
                var s1 = SafeSingleton.Instance;
               Console.WriteLine("【safe】 count:" + s1.Count);
            });
        }

        private static async Task SayNewName()
        {
            await Task.Run(() =>
            {
                var s = Singleton.Instance;
                Console.WriteLine("new count:" + s.Count);
                var s1 = SafeSingleton.Instance;
                Console.WriteLine("【safe】 new count:" + s1.Count);
            });
        }
    }

结果

 

 4、单例模式的复用

代码

/// <summary>
    /// 4、使用 C# 2.0 泛型来完成单例模式的重用
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class SingletonProvider<T> where T : new()
    {
        SingletonProvider() { }

        public static T Instance
        {
            get { return SingletonCreator.instance; }
        }

        class SingletonCreator
        {
            static SingletonCreator() { }

            internal static readonly T instance = new T();
        }
    }
    /// <summary>
    /// 4、业务类demo
    /// </summary>
    public class TestClass
    {
        private string _createdTimestamp;

        public TestClass()
        {
            _createdTimestamp = DateTime.Now.ToString();
        }

        public void Write()
        {
            Console.WriteLine(_createdTimestamp);
        }
    }
    /// <summary>
    /// 4、范型单例示例
    /// </summary>
    public class demo
    {
        private void dosomething()
        {
            SingletonProvider<TestClass>.Instance.Write();
        }
    }

 

 

 参考:

http://www.runoob.com/design-pattern/singleton-pattern.html

http://blog.csdn.net/dabian1987/article/details/6951652

http://blog.csdn.net/jiankunking/article/details/50867050

 http://www.cnblogs.com/kmsfan/p/4562323.html

 http://www.cnblogs.com/dreign/archive/2012/05/08/2490212.html(推荐)

 

欢迎阅读本系列文章:Head First设计模式之目录 

 

相关文章
|
8天前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
|
14天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
20 2
|
28天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
32 4
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
19天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
1月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
19 1
|
27天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
25 0
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
27 0
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
本教程详细讲解了Kotlin中的单例模式实现,包括饿汉式、懒汉式、双重检查锁、静态内部类及枚举类等方法,适合需要深入了解Kotlin单例模式的开发者。快速学习者可参考“简洁”系列教程。
36 0
|
2月前
|
设计模式 存储 数据库连接
Python编程中的设计模式之美:单例模式的妙用与实现###
本文将深入浅出地探讨Python编程中的一种重要设计模式——单例模式。通过生动的比喻、清晰的逻辑和实用的代码示例,让读者轻松理解单例模式的核心概念、应用场景及如何在Python中高效实现。无论是初学者还是有经验的开发者,都能从中获得启发,提升对设计模式的理解和应用能力。 ###