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设计模式之目录 

 

相关文章
|
21天前
|
设计模式 安全 Java
【设计模式系列笔记】单例模式
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点,以便全局范围内访问这个实例。单例模式的目标是限制一个类的实例化,确保在整个应用程序中只有一个实例存在,并提供对这个唯一实例的全局访问点。这对于控制对资源的访问、限制特定类的实例数量等场景非常有用。
122 5
|
1月前
|
设计模式 PHP
php设计模式--单例模式(三)
php设计模式--单例模式(三)
13 0
|
15天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
12天前
|
设计模式 安全 Java
【设计模式学习】单例模式和工厂模式
【设计模式学习】单例模式和工厂模式
|
13天前
|
设计模式 安全 Java
|
14天前
|
设计模式 存储 安全
Java 设计模式:深入单例模式的理解与应用
【4月更文挑战第27天】单例模式是一种常用的设计模式,在 Java 开发中扮演着重要角色。此模式的主要目的是保证一个类只有一个实例,并提供一个全局访问点。
20 0
|
18天前
|
设计模式 安全 Java
[设计模式Java实现附plantuml源码~创建型] 确保对象的唯一性~单例模式
[设计模式Java实现附plantuml源码~创建型] 确保对象的唯一性~单例模式
|
18天前
|
设计模式 安全 测试技术
[设计模式 Go实现] 创建型~单例模式
[设计模式 Go实现] 创建型~单例模式
|
28天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
16 1
|
1月前
|
设计模式 安全 Java
小谈设计模式(22)—单例模式
小谈设计模式(22)—单例模式