.NET c# 單體模式(Singleton)

來源:互聯網
上載者:User

單體模式(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:無事之冬

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.