极速理解设计模式系列:11.单例模式(Singleton Pattern)

news/2024/7/7 19:31:20

单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

三要点

       一、单例类只能有一个实例

       二、单例类必须自行创建自身实例

       三、单例类自行向整个系统提供实例

类图

应用场景:在整个系统中只需要一个类实例的全局可用类。比如License验证,内存管理等。

分析:其内部有很多需要提供全局访问的方法,对于C#中单例模式有两种创建:双检索单例、饿汉单例。

下面我们在控制台程序中演示如何创建者两种单例模式:

双检索单例

 

 
  1. //双检锁的单例模式 
  2.    public class License 
  3.    { 
  4.        private static License instance ; 
  5.        private static object _lock = new object(); 
  6.        private License() { } 
  7.        public static License GetInstance() 
  8.        { 
  9.            if (instance == null
  10.            { 
  11.                lock (_lock) 
  12.                { 
  13.                    if (instance == null
  14.                    { 
  15.                        instance = new License(); 
  16.                    } 
  17.                } 
  18.            } 
  19.            return instance; 
  20.        } 
  21.        public void CheckLicense(int code) 
  22.        { 
  23.            if (code == 20110925) 
  24.                Console.WriteLine("通过了License验证"); 
  25.            else 
  26.                Console.WriteLine("没有通过License验证");  
  27.        } 
  28.    } 

饿汉单例

 

 
  1. //饿汉单例模式 
  2. public class GcManager 
  3.     public static readonly GcManager instance = new GcManager(); 
  4.     private GcManager() { } 
  5.     public void FreeMemory() 
  6.     { 
  7.         GC.Collect(); 
  8.         Console.WriteLine("开始释放内存!"); 
  9.     } 
  10.     public void FreeObject() 
  11.     { 
  12.         Console.WriteLine("开始释放对象!"); 
  13.     } 

客户端应用

 

 
  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         // 
  5.         License.GetInstance().CheckLicense(20110925); 
  6.          
  7.         GcManager.instance.FreeMemory(); 
  8.         GcManager.instance.FreeObject(); 
  9.  
  10.         Console.ReadLine(); 
  11.     } 

        如果需要源码请点击 SingletonPattern 下载。


本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827002


http://lihuaxi.xjx100.cn/news/238799.html

相关文章

python中nlp的库_单词袋简介以及如何在Python for NLP中对其进行编码

python中nlp的库by Praveen Dubey通过Praveen Dubey 单词词汇入门以及如何在Python中为NLP 编写代码的简介 (An introduction to Bag of Words and how to code it in Python for NLP) Bag of Words (BOW) is a method to extract features from text documents. These featur…

Node.js入门(含NVM、NPM、NVM的安装)

本文最初发表于博客园,并在GitHub上持续更新前端的系列文章。欢迎在GitHub上关注我,一起入门和进阶前端。 以下是正文。 Node.js的介绍 引擎 引擎的特性: JS的内核即引擎。因为引擎有以下特性: (1)转化的作…

详细计算机专业毕业设计开题报告书写方法

目录 一、计算机毕业设计主要分为:选题、开题、正文、答辩 二、开题报告概述 三、如何选题-选题方向 四、如何选题-选题背景和意义 五、如何选题-文件综述 六、如何选题-研究内容 七、如何选题-组织结构 八、总体进度安排九、开题答辩 一、计算机毕业设计主…

以太坊 web3j for java 配置和使用 1

想知道更多区块链技术知识,请百度【链客区块链技术问答社区】 链客,有问必答!!环境: mac & android studio 一、 导入包 在app/build.gradle中:compile ‘org.web3j:core:3.0.1-android’ 即&#xff1…

nginx反向代理原理讲解

一 、概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务…

APP之红点提醒三个阶段

下面这个页面就是我们进入APP后的主界面。客户选项的红点上数字就是显示我们没有查看的客户总数量。 当我们切换到客户这个fragment时,会显示贷款客户数量与保险客户数量。 当我们随便点击入一个选项,假如进入到保险客户的这个activity里面,L…

如何重构“箭头型”代码

本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论(微博原文),在微博上大家有各式各样的问题和想法。按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我觉得很多…

区块链中的去中心化

想知道更多区块链技术知识,请百度【链客区块链技术问答社区】 链客,有问必答!! 区块链是什么我想大家都已经知道了,所以就不再细说了毕竟点开这篇文章如果你都不知道区块链是什么的话,就没什么必要看了。 …