单例模式
2015-11-16 11:39
288 查看
概述
单例模式可以简单理解为一个类只有一个实例化,并提供全局的访问点。
单例模式存在的意义
举个例子,在操作系统中,任务管理器只能存在一个,对吧。那么接下来的事情就是简单的实现单例模式了。
实现简单的单例模式
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Singleton { public class Singleton { //使用静态变量保存类的实例 private static Singleton uniqueInstance; //私有构造 private Singleton() { } /// <summary> /// 全局访问点 /// </summary> /// <returns></returns> public static Singleton GetInstance() { if (uniqueInstance==null) { Console.WriteLine("实例化 单例模式."); uniqueInstance = new Singleton(); } else { Console.WriteLine("返回 单例模式"); } return uniqueInstance; } } class Program { static void Main(string[] args) { Singleton.GetInstance(); Singleton.GetInstance(); } } }
1. 私有构造函数:
只有在该类中使用,不能被外界访问。也就是说,该类不能通过外界 new操作 实例化一个对象。而只能在本类中实例化。
2. 静态变量:
静态变量是在堆分配的,而普通变量是在栈上分配的,也就是说它的生存期为整个源程序。
3. 静态函数:
静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。 这里,我们使用静态函数访问静态变量。
多线程下的单例模式
在上诉代码中,如果是多线程的情况,很有可能会创建多个实例化。但是我们想要的是,只要第一次创建该实例,其他情况都返回该实例。我们的解决方案是采用线程加锁的方式。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Singleton { public class Singleton { //使用静态变量保存类的实例 private static Singleton uniqueInstance; //私有构造 private Singleton() { } //线程锁 private static readonly object locker = new object(); /// <summary> /// 全局访问点 /// </summary> /// <returns></returns> public static Singleton GetInstance() { if (uniqueInstance==null) { lock (locker) { if (uniqueInstance == null) { Console.WriteLine("实例化 单例模式."); uniqueInstance = new Singleton(); } } } else { Console.WriteLine("返回 单例模式"); } return uniqueInstance; } } class Program { static void Main(string[] args) { Singleton.GetInstance(); Singleton.GetInstance(); } } }
相关文章推荐
- 设计模式1—创建型模式
- java线程协作,经典生产者/消费者模式(二、Lock和Condition)
- 简单的单例模式Demo
- 深入理解JavaScript系列(34):设计模式之命令模式
- 设计模式--抽象工厂模式(八)
- 23种设计模式
- java几种设计模式
- 设计模式-单利模式
- 救援模式和单用户模式和克隆虚拟机及Linux互相登录
- 23种设计模式(19)java责任链模式
- 访问修饰符,单例模式
- Vmware 11使用-软件操作以及网卡模式区别介绍
- 设计模式系列四(建造者模式)
- 装饰者模式(decorator)完全解析
- 修改数据库为多用户模式
- 设计模式--原型模式(Prototype)
- (字符串的模式匹配4.7.19——前缀数组suffix的应用)POJ 2752 Seek the Name, Seek the Fame(求解一个字符串中前缀和后缀一样的位置)
- 【VC】设置工程属性,实现软件以管理员模式打开!
- 模式自由(Schema-free)和数据存储的非格式化趋势
- 【Java设计模式】之单例模式