设计模式之单例模式学习(C#)

最近在换工作,发现面试都会问到设计模式中的单例模式,所以回家做了一个对于单例模式的总结,如有问题,请留言指教。

单例模式的简介

单例模式:就是保证系统中只有一个实例,就叫单例模式(singleton pattern);

单例模式分为:饿汉式和懒汉式;

单例模式必须遵循的规则:

1. 该类,在整个系统中必须只能有一个实例;

2. 这个唯一的实例,必须类自行创建这个实例;

3. 必须自行向整个系统提供这个实例;

单例模式具体实现必须遵循的规则:

1. 定义一个静态变量来保存实例;

2. 定义一个私有的构造函数,阻止外界自己创建实例;

3. 定义一个静态公有方法,提供一个全局的访问点;

4. 考虑到线程安全时,需要定义一个标识,确保线程同步机制;

单例模式的典型的应用代码:

饿汉式

饿汉式,不用考虑在用户给实例赋值null时,出问题.因为每次进去都会实例化;

  public class  Singleton
{
   private static Sinleton mySingleton=new Sinleton();
   private Sinleton
{

}
   public static Sinleton GetIntance()
{
return mySinleton;
}
}

懒汉式

public class Singleton
{
  private static Singleton mySingleton;
  private Singleton
{

}
  public static Singleton GetIntance()
{
   if(mySingleton==null)
{
    return mySingleton=new Singleton();
}
return mySingleton;
}
}

单例模式多线程情况

针对懒汉式,多线程下出现这种情况:比如两线程A和B,A运行到if(mySingleton==null) 时,B运行到mySingleton=new Singleton();B虽然实例化了mySingleton,但是对于A还是没有被实例化,A继续会执行 mySingleton=new Singleton();这个时候就出现问题了 ,有两个实例的问题;于是改编代码

public class SingletonExample
{
 private static SingletonExample mySingleton;
private static readonly object  locker=new object();
private SingletonExample
{

}
//该公有访问方法,可以重载多参数的方法;
public static SingletonExample GetInstance()
{
if(mySingleton==null)
{
lock(locker)
{

 mySingleton=new SingletonExample();

}
}
return mySingleton;
}
}

此时,A,B同时运行到lock(locker) ,这时只能一个线程访问,于是B先执行,B获得锁,然后B执行完后,解锁. A执行去,因为没有判断是否mySingleton==null,所以还是会实例化,出现两个实例的情况;

于是双重检查模式(DCL)就出现了。代码如下:

public class SingletonExample
{//此处是懒汉式; 未实例化 ,比较常用.//饿汉式: private static SingletonExample mySingleton =new SingletonExample();  //已实例化
 private static SingletonExample mySingleton;
private static readonly object  locker=new object();
private SingletonExample()
{

}//该公有访问方法,可以重载多参数的方法;
public static SingletonExample GetInstance()
{
if(mySingleton==null)
{
lock(locker)
{
if(mySingleton==null)
{
 mySingleton=new SingletonExample();
}
}
}
return mySingleton;
}
}

 

注意:

1.因为实现单例模式的这个实际是一个类,所以除了遵循了单例该有的规则,其他的字段,属性都和普通类一样都可以存在;

关于单例模式的基础学习就是以上,有问题,请留言互相讨论;THX

时间: 2024-08-08 13:57:07

设计模式之单例模式学习(C#)的相关文章

javaScript设计模式---(单例模式学习)

单例模式 一个类只能有一个实例化对象.如页面中的弹出框蒙层,一个页面只需要一个. 实现方式:创建一个类,这个类包含一个方法,这个方法在没有对象存在的情况下,将会创建一个新的实例对象.如果对象存在,这个对象只是返回这个对象的引用. var singleton = (function singleton () { var instance = null; // 存储单例实例的引用 // 创建单例 function init () { // 私有方法和属性 function privateMethod

【设计模式】单例模式学习

一:必要性 无论是在软件还是系统中,有时我们只需要某个东西出现一次,记得老师上课时提到的任务管理器,就是最典型的一个例子,任务管理器能告诉用户现在计算机里正在运行的程序的信息,试想一下如果能打开两个任务管理器,那么同步又是个大问题,虽然这个问题就不是个问题,没人愿意不明不白的看到两个任务管理器,如果有不同也不是用户的关注重点.而在记忆中,早期的windows就能打开很多任务管理器,现在想想这样是不太合理的.就算他们达成了同步一致的要求,那又有什么意义呢,都一样的东西,不过是浪费系统资源罢了.所以

设计模式——单例模式学习

单例模式属于设计模式中的创建模式,即创建对象时,不再由我们直接实例化对象,而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能.更好的架构优势. 1.概念 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.选择单例模式就是为了避免不一致状态.使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection). Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对

设计模式实例学习-单例模式(Android中的使用场景)

1.设计模式实例-单例模式 单例模式,故名思议,是指在一个类中通过设置静态使得其仅创造一个唯一的实例.这样设置的目的是满足开发者的希望--这个类只需要被实例化创建一次,同时因为其为静态的缘故,加载的速度也应该快于正常实例化一个类的速度(理论上). 在Android开发中,当我们需要创建一个Fragment的时候常常会用到这样的模式,没有代码的学习是虚无的,接下来亮代码学习: public class SelectFrame extends Fragment { private final sta

C#设计模式(1)——单例模式

一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考.首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二.单例模式的介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只

每天一个设计模式-4 单例模式(Singleton)

每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固定紧.不一会儿,自行车就被你修好了:首先,这个扳手你不会扔掉,下次用的时候直接找出来就用了.好,今天的主题出来了“单例模式”. 2.与变成关联 在上面的例子中,能找出几个关键字:“买一个扳手”,“螺丝钉固定紧”,“不会扔掉扳手”,“下次用直接找出来”.我们结合标题和这几个关键字好好理解一下: 买一个

最常用的设计模式(单例模式)

记得刚开始涉足程序的时候, 去笔试 ,发现有一个笔试题经常粗线,写一个单例模式的基本实现, 当时没研究设计模式也就不知为何物, 到今日  , 才发现它已成为我日常开发最常用的一种设计模式. 我写的所有设计模式的代码都会用java 呈现, 虽然第一个学习的是c++但是 最开始作为工作的是java,并且有点偏好java 单例模式 , 意思就是 整个系统仅只有此类的一个实力, 当然这只是狭义的单例,经常看到变种的单例是允许,创建指定数量的实例的 单例模式是一种创建型模式. 它是优化的一种策划, 避免重

java 设计模式之单例模式

--------2015-11-20 14:45:10 java设计模式之单例模式(Singleton): ---应用场合:只需要一个对象就可以了,例如一个朝代一个皇帝. ---作用:保证某个应用程序中某个实例有且只有一个.共同使用一个,节省资源. ---类型:饿汉模式,懒汉模式. 一.饿汉模式(类加载的时候就会实例化,线程安全) 1 package com.sun.singleton; 2 3 //饿汉模式 4 public class Singleton { 5 6 //将构造函数私有化,不

常见的设计模式:单例模式、工厂模式、观察者模式、装饰模式与适配器模式

常见的设计模式:单例模式.工厂模式.观察者模式.装饰模式与适配器模式 这里可以阅读Terry Lee的设计模式系列来理解学习一下 1.4.1 单例模式 .NET设计模式(2):单件模式(Singleton Pattern)  http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 1.4.2 抽象工厂模式 .NET设计模式(3):抽象工厂模式(Abstract Factory) http://terrylee.cnblogs.com/