無廢話c#設計模式之二:singleton
意圖
保證乙個類只有乙個例項,並提供訪問它的全域性訪問點。
場景
我們現在要做乙個網路遊戲的服務端程式,需要考慮怎麼樣才能承載大量的使用者。在做web程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分配使用者到各個伺服器上去。
需要考慮的問題是,即使在多執行緒的併發狀態下,使用者只能通過乙個唯一的入口來分配,由此引入了singleton模式來實現這個唯一的入口。
示例**
usingsystem;
usingsystem.collections.generic;
usingsystem.threading;
namespacesingletonexample
loadbalanceserver
.getloadbalanceserver().showserverinfo();
}
staticvoidenterplayer(objectplayername)
}
classloadbalanceserver
}
publicstaticloadbalanceservergetloadbalanceserver()
}
}
returnlbs;
}
publiclobbyservergetlobbyserver()
returnls;
}
publicvoidshowserverinfo()
}
}
}
classlobbyserver
}
privatestringservername;
publicstringservername
}
publiclobbyserver(stringservername)
publicvoidenterplayer(stringplayername)
}
}
**執行結果如下圖:
**說明
lloadbalanceserver
類實現了singleton模式,也就是說無論在什麼情況下,只會有乙個loadbalanceserver類的例項出現。
llobbyserver
類表示大廳服務,使用者進入大廳後和大廳服務進行服務,在這裡我們僅僅在大廳服務裡面儲存了使用者列表。
lsingleton
模式有很多實現方式,在這裡使用的是雙重鎖定方式。對於c#來說,可能使用靜態初始化方式是最簡潔的,這裡就不演示了。
lloadbalanceserver
類的getlobbyserver()方法負責返回乙個壓力最小的lobbyserver物件。
l例項化loadbalanceserver的時候sleep了執行緒,目的是模擬高併發的情況,在正式**中沒有必要這樣做。
何時採用
l從**角度來說,當你希望類只有乙個例項的時候。
l從應用角度來說,你希望有乙個總管來負責某一件事情。並且這件事情的分配只能有乙個人進行,如果有多個人進行肯定會弄亂。比如建立處理流水號如果有兩個地方在建立的話是不是就會重複了呢?
實現要點
l乙個singleton類,它能確保自身的例項是唯一的。
注意事項
l不要濫用singleton模式,只有非乙個例項不可的情況下才考慮引入singleton。否則,程式的可擴充套件性可能會受到限制。
(原創)無廢話C 設計模式之二 Singleton
無廢話c 設計模式之二 singleton 意圖 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點。場景 我們現在要做乙個網路遊戲的服務端程式,需要考慮怎麼樣才能承載大量的使用者。在做web程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分...
無廢話C 設計模式之二 Singleton
意圖 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點。場景 我們現在要做乙個網路遊戲的服務端程式,需要考慮怎麼樣才能承載大量的使用者。在做 web程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分配使用者到各個伺服器上去。需要考慮的問題是...
無廢話C 設計模式之二 Singleton
無廢話c 設計模式之二 singleton 意圖 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點。場景 我們現在要做乙個網路遊戲的服務端程式,需要考慮怎麼樣才能承載大量的使用者。在做web程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分...