.NET c# 单体模式(Singleton)

  单体模式(Singleton)是经常为了保证应用程序操作某一全局对象,让其保持一致而产生的对象,例如对文件的读写操作的锁定,数据库操作的时候的事务回滚,还有任务管理器操作,都是一单体模式读取的。

  创建一个单体模式类,必须符合三个条件:

  1:私有构造函数(防止其他对象创建实例);

  2:一个单体类型的私有变量;

  3:静态全局获取接口

  下面我写一个类,为了看是不是单体,就加了一个计数器,如果是同一个类,那么这个类的计数每次调用以后就应该自动加一,而不是重新建对象归零:

  .NET c# 单体模式

  using System;

  using System.Threading;

  public class Singleton{

  private int ObjCount=0;

  private Singleton(){

  Console.WriteLine("创建对象");

  }

  private static Singleton objInstance = null;

  public static  Singleton getInstance() {

  if (objInstance==null) objInstance=new Singleton();

  return objInstance;

  }

  public void ShowCount(){

  ObjCount++;

  Console.WriteLine("单个对象被调用了{0}次",ObjCount);

  }

  };

  然后我们来测试一下:

  public class ConsoleTest{

  public static void Main(string[] args){

  Console.WriteLine("开始执行单体模式");

  for(int i=0;i<5;i++){

  Singleton.getInstance().ShowCount();

  }

  Console.ReadLine();

  }

  };

  我在这个Main里面执行了5次,看看输出的结果:

  开始执行单体模式

  创建对象

  单个对象被调用了1次

  单个对象被调用了2次

  单个对象被调用了3次

  单个对象被调用了4次

  单个对象被调用了5次

  在这里可以看出,每次都是使用的同一个对象,实现了单体。

  为了测试在多线程下面是否是单体,下面我写了一个多线程测试的:

  class ApartmentTest

  {

  public static void RunMoreThread()

  {

  Thread newThread =  new Thread(new ThreadStart(ThreadSingleMethod));

  newThread.SetApartmentState(ApartmentState.MTA);

  Console.WriteLine("ThreadState: {0}, ApartmentState: {1},ManagedThreadId:{2}", newThread.ThreadState, newThread.GetApartmentState(),newThread.ManagedThreadId );

  newThread.Start();

  }

  public static void ThreadSingleMethod() {

  Singleton.getInstance().ShowCount();

  }

  };

  然后每次for循环执行ApartmentTest.RunMoreThread();

  再看看输出的结果:开始执行单体模式

  ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:3

  创建对象

  单个对象被调用了1次

  ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:4

  单个对象被调用了2次

  ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:5

  单个对象被调用了3次

  ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:6

  单个对象被调用了4次

  ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:7

  单个对象被调用了5次

  根据ManagedThreadId,可以看出不同的线路访问达到了单体,OK!

  c#的单体模式介绍完毕;

  下面是PHP 单体模式的代码:

  <?php

  header("Content-Type: text/html; charset=utf-8");

  class Singleton{

  private $ObjCount=0;

  private function __construct(){

  echo("创建对象<hr/>");

  }

  public static  function   getInstance() {

  static $objInstance = null;

  if ( $objInstance == null )

  $objInstance =  new Singleton();

  return $objInstance;

  }

  public function ShowCount(){

  $this->ObjCount++;

  echo("单个对象被调用了".$this->ObjCount.'次数<hr/>');

  }

  };

  for($i=0;$i<5;$i++)

  Singleton::getInstance()->ShowCount();

  ?>

  请注意以上PHP代码的私有静态变量范围,不要放在类主体。

  执行结果:

  创建对象

  --------------------------------------------------------------------------------

  单个对象被调用了1次数

  --------------------------------------------------------------------------------

  单个对象被调用了2次数

  --------------------------------------------------------------------------------

  单个对象被调用了3次数

  --------------------------------------------------------------------------------

  单个对象被调用了4次数

  --------------------------------------------------------------------------------

  单个对象被调用了5次数

  下面我们再来看看Java版本的写法:

  单体模式 Java

  class Singleton{

  private int ObjCount=0;

  private Singleton(){

  System.out.println("创建对象");

  }

  private static Singleton objInstance = null;

  public static  Singleton getInstance() {

  if (objInstance==null) objInstance=new Singleton();

  return objInstance;

  }

  public void ShowCount(){

  ObjCount++;

  System.out.println("单个对象被调用了"+ ObjCount +"次");

  }

  };

  class ConsoleTestSingleton{

  public static void main(String args[]){

  System.out.println("开始执行单体模式");

  for(int i=0;i<5;i++){

  Singleton.getInstance().ShowCount();

  }

  }

  };

  基本代码与c#一致,执行结果:

  开始执行单体模式

  创建对象

  单个对象被调用了1次

  单个对象被调用了2次

  单个对象被调用了3次

  单个对象被调用了4次

  单个对象被调用了5次

  可以看出,也是完全的单体,只要记住开头提到的三点,即可掌握该模式。

  ----------

  1:今天L出差

  2:昨天聚会,比较Happy

  3:SL和Z都是手机Q网

  4:无事之冬