.NET c# 單體模式(Singleton)
更新時間:2007年12月11日 21:06:56 作者:
單體模式(Singleton)是經常為了保證應用程序操作某一全局對象,讓其保持一致而產生的對象,例如對文件的讀寫操作的鎖定,數(shù)據(jù)庫操作的時候的事務回滾,還有任務管理器操作,都是一單體模式讀取的。
創(chuàng)建一個單體模式類,必須符合三個條件:
1:私有構造函數(shù)(防止其他對象創(chuàng)建實例);
2:一個單體類型的私有變量;
3:靜態(tài)全局獲取接口
下面我寫一個類,為了看是不是單體,就加了一個計數(shù)器,如果是同一個類,那么這個類的計數(shù)每次調用以后就應該自動加一,而不是重新建對象歸零:
.NET c# 單體模式
using System;
using System.Threading;
public class Singleton{
private int ObjCount=0;
private Singleton(){
Console.WriteLine("創(chuàng)建對象");
}
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("開始執(zhí)行單體模式");
for(int i=0;i<5;i++){
Singleton.getInstance().ShowCount();
}
Console.ReadLine();
}
};
我在這個Main里面執(zhí)行了5次,看看輸出的結果:
開始執(zhí)行單體模式
創(chuàng)建對象
單個對象被調用了1次
單個對象被調用了2次
單個對象被調用了3次
單個對象被調用了4次
單個對象被調用了5次
在這里可以看出,每次都是使用的同一個對象,實現(xiàn)了單體。
為了測試在多線程下面是否是單體,下面我寫了一個多線程測試的:
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循環(huán)執(zhí)行ApartmentTest.RunMoreThread();
再看看輸出的結果:開始執(zhí)行單體模式
ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:3
創(chuàng)建對象
單個對象被調用了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次
根據(jù)ManagedThreadId,可以看出不同的線路訪問達到了單體,OK!
c#的單體模式介紹完畢;
下面是PHP 單體模式的代碼:
<?php
header("Content-Type: text/html; charset=utf-8");
class Singleton{
private $ObjCount=0;
private function __construct(){
echo("創(chuàng)建對象<hr/>");
}
public static function getInstance() {
static $objInstance = null;
if ( $objInstance == null )
$objInstance = new Singleton();
return $objInstance;
}
public function ShowCount(){
$this->ObjCount++;
echo("單個對象被調用了".$this->ObjCount.'次數(shù)<hr/>');
}
};
for($i=0;$i<5;$i++)
Singleton::getInstance()->ShowCount();
?>
請注意以上PHP代碼的私有靜態(tài)變量范圍,不要放在類主體。
執(zhí)行結果:
創(chuàng)建對象
--------------------------------------------------------------------------------
單個對象被調用了1次數(shù)
--------------------------------------------------------------------------------
單個對象被調用了2次數(shù)
--------------------------------------------------------------------------------
單個對象被調用了3次數(shù)
--------------------------------------------------------------------------------
單個對象被調用了4次數(shù)
--------------------------------------------------------------------------------
單個對象被調用了5次數(shù)
下面我們再來看看Java版本的寫法:
單體模式 Java
class Singleton{
private int ObjCount=0;
private Singleton(){
System.out.println("創(chuàng)建對象");
}
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("開始執(zhí)行單體模式");
for(int i=0;i<5;i++){
Singleton.getInstance().ShowCount();
}
}
};
基本代碼與c#一致,執(zhí)行結果:
開始執(zhí)行單體模式
創(chuàng)建對象
單個對象被調用了1次
單個對象被調用了2次
單個對象被調用了3次
單個對象被調用了4次
單個對象被調用了5次
可以看出,也是完全的單體,只要記住開頭提到的三點,即可掌握該模式。
----------
1:今天L出差
2:昨天聚會,比較Happy
3:SL和Z都是手機Q網
4:無事之冬
創(chuàng)建一個單體模式類,必須符合三個條件:
1:私有構造函數(shù)(防止其他對象創(chuàng)建實例);
2:一個單體類型的私有變量;
3:靜態(tài)全局獲取接口
下面我寫一個類,為了看是不是單體,就加了一個計數(shù)器,如果是同一個類,那么這個類的計數(shù)每次調用以后就應該自動加一,而不是重新建對象歸零:
.NET c# 單體模式
using System;
using System.Threading;
public class Singleton{
private int ObjCount=0;
private Singleton(){
Console.WriteLine("創(chuàng)建對象");
}
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("開始執(zhí)行單體模式");
for(int i=0;i<5;i++){
Singleton.getInstance().ShowCount();
}
Console.ReadLine();
}
};
我在這個Main里面執(zhí)行了5次,看看輸出的結果:
開始執(zhí)行單體模式
創(chuàng)建對象
單個對象被調用了1次
單個對象被調用了2次
單個對象被調用了3次
單個對象被調用了4次
單個對象被調用了5次
在這里可以看出,每次都是使用的同一個對象,實現(xiàn)了單體。
為了測試在多線程下面是否是單體,下面我寫了一個多線程測試的:
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循環(huán)執(zhí)行ApartmentTest.RunMoreThread();
再看看輸出的結果:開始執(zhí)行單體模式
ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:3
創(chuàng)建對象
單個對象被調用了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次
根據(jù)ManagedThreadId,可以看出不同的線路訪問達到了單體,OK!
c#的單體模式介紹完畢;
下面是PHP 單體模式的代碼:
<?php
header("Content-Type: text/html; charset=utf-8");
class Singleton{
private $ObjCount=0;
private function __construct(){
echo("創(chuàng)建對象<hr/>");
}
public static function getInstance() {
static $objInstance = null;
if ( $objInstance == null )
$objInstance = new Singleton();
return $objInstance;
}
public function ShowCount(){
$this->ObjCount++;
echo("單個對象被調用了".$this->ObjCount.'次數(shù)<hr/>');
}
};
for($i=0;$i<5;$i++)
Singleton::getInstance()->ShowCount();
?>
請注意以上PHP代碼的私有靜態(tài)變量范圍,不要放在類主體。
執(zhí)行結果:
創(chuàng)建對象
--------------------------------------------------------------------------------
單個對象被調用了1次數(shù)
--------------------------------------------------------------------------------
單個對象被調用了2次數(shù)
--------------------------------------------------------------------------------
單個對象被調用了3次數(shù)
--------------------------------------------------------------------------------
單個對象被調用了4次數(shù)
--------------------------------------------------------------------------------
單個對象被調用了5次數(shù)
下面我們再來看看Java版本的寫法:
單體模式 Java
class Singleton{
private int ObjCount=0;
private Singleton(){
System.out.println("創(chuàng)建對象");
}
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("開始執(zhí)行單體模式");
for(int i=0;i<5;i++){
Singleton.getInstance().ShowCount();
}
}
};
基本代碼與c#一致,執(zhí)行結果:
開始執(zhí)行單體模式
創(chuàng)建對象
單個對象被調用了1次
單個對象被調用了2次
單個對象被調用了3次
單個對象被調用了4次
單個對象被調用了5次
可以看出,也是完全的單體,只要記住開頭提到的三點,即可掌握該模式。
----------
1:今天L出差
2:昨天聚會,比較Happy
3:SL和Z都是手機Q網
4:無事之冬
相關文章
ASP.NET實現(xiàn)多域名多網站共享Session值的方法
實現(xiàn)功能:可設置哪些站點可以共享Session值,這樣就防止別人利用這個去訪問,要想實現(xiàn)這個功能就必須得把Session值 放入數(shù)據(jù)庫中, 所有我們先在VS命令工具下注冊一個2011-11-11ASP.NET?MVC5網站開發(fā)之用戶添加和瀏覽2(七)
這篇文章主要為大家詳細介紹了ASP.NET?MVC5網站開發(fā)之用戶添加和瀏覽,感興趣的小伙伴們可以參考一下2016-08-08ASP.NET網站的創(chuàng)建與發(fā)布過程簡析
這篇文章主要介紹了ASP.NET的創(chuàng)建與發(fā)布過程,過程實現(xiàn)很簡單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-08-08Asp.Net Core中創(chuàng)建多DbContext并遷移到數(shù)據(jù)庫的步驟
這篇文章主要介紹了Asp.Net Core中創(chuàng)建多DbContext并遷移到數(shù)據(jù)庫的步驟,幫助大家更好的理解和學習使用Asp.Net Core,感興趣的朋友可以了解下2021-03-03