记一下学习单例模式的笔记:
单例就是要保证该类仅有一个实例。实现完全封闭的单例(外部不能new)其实就要两点要求:
根据new实例的时机,分为饿汉式和懒汉式:
特点:加载时new,一开始全局就存在该唯一实例,每次用到只要获取就行,提前占用系统资源但不存在线程安全问题。代码如下:
public sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton GetInstance() { return instance; } }
特点:真正需要用到的时候才实例化,不提前占用资源但多个线程同时用到该实例时,会存在判断静态变量都为null都去new而产生多个实例的情况。有线程安全问题,但可以用双重锁定解决。
单线程懒汉单例代码如下:
public class Singleton { private static Singleton instance = null; private Singleton() { } public static Singleton GetInstance() { if (instance == null) instance = new Singleton(); return instance; } }
多线程懒汉单例代码如下:
public class Singleton { private static Singleton instance = null; private static readonly object obj = new object(); private Singleton() { } public static Singleton GetInstance() { //双重锁定 if (instance == null)//只有为null需要实例化处理时才进行加锁,提高性能避免不必要的等待 { lock (obj) { if (instance == null)//避免其他线程等待锁释放期间有线程已经实例化,从而造成多个实例 instance = new Singleton(); } } return instance; } }
介绍一个有意思的单例-泛型注册式,是对单例的扩展,主要了解它的设计思想。
其实每个类单例模式实现代码都是差不多的:
实现代码如下(例子使用饿汉式,当然也可以用懒汉式):
public abstract class Singleton<T> where T:class,new() { private static readonly T instance = new T(); protected Singleton() { } public static T GetSingleton()//获取单例 { return instance; } } public class Person : Singleton<Person> { }
可以看到这种单例通过继承的方式,既可以new实例也可以获取单例实例。如果要实现上面的完全封闭(禁用外部new),也可以完全在Person类中写个私有构造器在Singleton<T>类中实例的获取new T()改为反射调用私有构造器的方式实现,总感觉怪怪的。
下面是主程序调用该单例方法:
static void Main(string[] args) { Person p1 = Person.GetSingleton(); Person p2 = Singleton<Person>.GetSingleton(); if (object.ReferenceEquals(p1, p2)) { Console.WriteLine("两个对象是同一实例"); } Console.ReadKey(); }
输出结果:
以上就是c# 单例模式的实现方法的详细内容,更多关于c# 单例模式的资料请关注小牛知识库其它相关文章!
本文向大家介绍c# 单例模式的实现方法,包括了c# 单例模式的实现方法的使用技巧和注意事项,需要的朋友参考一下 单例模式大概是所有设计模式中最简单的一种,如果在面试时被问及熟悉哪些设计模式,你可能第一个答的就是单例模式。 单例模式的实现分为两种:饿汉式和懒汉式。前者是在静态构造函数执行时就立即实例化,后者是在程序执行过程中第一次需要时再实例化。两者有各自适用的场景,实现方式也都很简单,唯一在设计时
本文向大家介绍c#设计模式之单例模式的实现方式,包括了c#设计模式之单例模式的实现方式的使用技巧和注意事项,需要的朋友参考一下 场景描述 单例模式对于我们来说一点也不模式,是一个常见的名称,单例模式在程序中的实际效果就是:确保一个程序中只有一个实例,并提供一个全局访问点,节省系统资源 单例模式无论是在实际开发中还是在软件应用中比较常见,比如,windows系统的任务管理器、IIS的HttpAppl
单例模式的定义 确保某一个类只有一个实例, 而且自行实例化并向整个系统提供这个实例。 方法一: static Singleton *getInstance() { static Singleton locla_s; return &locla_s; } 该代码可能在c++11之前的版本导致多次构造函数的调用,所以只能在较新的编译器上使用。 方法二:
本文向大家介绍c#单例模式(Singleton)的6种实现,包括了c#单例模式(Singleton)的6种实现的使用技巧和注意事项,需要的朋友参考一下 1.1.1 摘要 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要介绍的——单例模式(Singlet
本文向大家介绍C#设计模式之单例模式实例讲解,包括了C#设计模式之单例模式实例讲解的使用技巧和注意事项,需要的朋友参考一下 前言 最近开始花点心思研究下设计模式,主要还是让自己写的代码可重用性高、保证代码可靠性。所谓设计模式,我找了下定义:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工
本文向大家介绍C#单例模式(Singleton Pattern)实例教程,包括了C#单例模式(Singleton Pattern)实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式讲述了C#单例模式(Singleton Pattern)的实现方法,分享给大家供大家参考。具体实现方法如下: 一般来说,当从应用程序全局的角度来看,如果只允许类的一个实例产生,就可以考虑单例模式。 1.即时