मुझे लगता है कि आप यहां ईमानदार होने के लिए कारखाने के पैटर्न से बेहतर होंगे। या ब्रायन Dilley की तरह एक आईओसी उपकरण का उपयोग करें। सी # दुनिया में भार हैं, यहां सबसे लोकप्रिय हैं: कैसल/विंडसर, स्ट्रक्चर मैप, यूनिटी, निनजेक्ट।
उस तरफ, मैंने सोचा कि वास्तव में आपकी समस्या को हल करने में मजा आएगा! इस पर एक नज़र डालें:
//abstract, no one can create me
public abstract class Room
{
protected static List<Room> createdRooms = new List<Room>();
private static List<Type> createdTypes = new List<Type>();
//bass class ctor will throw an exception if the type is already created
protected Room(Type RoomCreated)
{
//confirm this type has not been created already
if (createdTypes.Exists(x => x == RoomCreated))
throw new Exception("Can't create another type of " + RoomCreated.Name);
createdTypes.Add(RoomCreated);
}
//returns a room if a room of its type is already created
protected static T GetAlreadyCreatedRoom<T>() where T : Room
{
return createdRooms.Find(x => x.GetType() == typeof (T)) as T;
}
}
public class WickedRoom : Room
{
//private ctor, no-one can create me, but me!
private WickedRoom()
: base(typeof(WickedRoom)) //forced to call down to the abstract ctor
{
}
public static WickedRoom GetWickedRoom()
{
WickedRoom result = GetAlreadyCreatedRoom<WickedRoom>();
if (result == null)
{
//create a room, and store
result = new WickedRoom();
createdRooms.Add(result);
}
return result;
}
}
public class NaughtyRoom :Room
{
//allows direct creation but forced to call down anyway
public NaughtyRoom() : base(typeof(NaughtyRoom))
{
}
}
internal class Program
{
private static void Main(string[] args)
{
//Can't do this as wont compile
//WickedRoom room = new WickedRoom();
//have to use the factory method:
WickedRoom room1 = WickedRoom.GetWickedRoom();
WickedRoom room2 = WickedRoom.GetWickedRoom();
//actually the same room
Debug.Assert(room1 == room2);
NaughtyRoom room3 = new NaughtyRoom(); //Allowed, just this once!
NaughtyRoom room4 = new NaughtyRoom(); //exception, can't create another
}
}
विकेट्रूम एक ऐसी कक्षा है जो सिस्टम को सही ढंग से लागू करती है। किसी भी क्लाइंट कोड को सिंगलटन विकेट्रूम क्लास की पकड़ मिल जाएगी। NaughtyRoom सिस्टम को ठीक से लागू नहीं करता है, लेकिन यहां तक कि इस वर्ग को दो बार तत्काल नहीं किया जा सकता है। एक अपवाद में एक दूसरा तत्काल परिणाम।
स्रोत
2009-02-25 22:54:54
मैं कुछ समय के लिए सिंगलेट के संबंध में बाड़ पर रहा हूं। लेकिन यह धागा उनको उपयोग न करने के लिए कुछ अच्छे अंक बनाता है: http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons – JMD
सैकड़ों धागे, ब्लॉग पोस्ट और कारणों से भरे लेख हैं सिंगलेट का उपयोग करने के लिए। यह बेहद दुर्लभ है कि वे वास्तव में आपके कोड में सुधार करते हैं। कृपया इसे पुनर्विचार करें। आप, और उस कोड के साथ काम कर रहे हर दूसरे डेवलपर, हर जगह plastering सिंगलेट्स पछतावा करने जा रहा है। – jalf