zoukankan      html  css  js  c++  java
  • 单例模式(Singleton Pattern)

    模式定义

    单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
    单利模式所要满足的条件:

    • 只能有一个实例
    • 必须自行创建
    • 自行向整个系统提供访问

    UML类图

    • 私有静态自身类型字段
    • 私有构造方法
    • 公有静态函数返回自身对象

    代码结构

    	public static class SingletonApp
    	{
    		public static void Run()
    		{
    			Singleton s1 = Singleton.Instance();
    			Singleton s2 = Singleton.Instance();
    
    			if(s1 == s2)
    			{
    				Console.WriteLine("Objects are the same instance");
    			}
    		}
    	}
    
    	public class Singleton
    	{
    		private static Singleton _instance;
    
    		protected Singleton()
    		{}
    		public static Singleton Instance()
    		{
    			if(_instance == null)
    			{
    				_instance = new Singleton();
    			}
    
    			return _instance;
    		}
    	}
    

    多线程代码结构

    这里介绍著名的双锁机制。(思考:一个类中有一静态字段和一修改该字段的静态方法,对于多线程是否都是不安全的?)

    	public class Singleton
    	{
    		private static Singleton _instance;
    		protected Singleton()
    		{ }
    		public static Singleton Instance()
    		{
    			if (_instance == null)
    			{
    				lock (typeof(Singleton))
    				{
    					if (_instance == null)
    					{
    						_instance = new Singleton();
    					}
    				}
    			}
    			return _instance;
    		}
    	}
    

    C#语法优化

    我们用的C#语言是高级、简洁的语言。那么更简洁的写法为:(注意关键词readonly)

    	public class Singleton
    	{
    		private static readonly Singleton _instance = new Singleton();
    		protected Singleton()
    		{ }
    		public static Singleton GetInstance()
    		{
    			return _instance;
    		}
    	}
    

    情景模式

    利用单例模式主要用来限制类只能实力化一个对象,所有访问都访问唯一一个对象。有时我们读取配置文件时,创建单例模式。

  • 相关阅读:
    Python属性、方法和类管理系列之----__slots__属性
    Python属性、方法和类管理系列之----属性初探
    解释型语言和编译型语言的不同以及Python如何运行
    Python的字符串操作和Unicode
    Python中异常(Exception)的总结
    leetcode经典动态规划题解题报告
    mybatis源码分析一
    ReentrantLock源码分析
    CopyOnWriteArrayList,CopyOnWriteArraySet源码分析
    CyclicBarrier源码分析
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/8352651.html
Copyright © 2011-2022 走看看