Chociaż trudno powiedzieć, co dokładnie masz na myśli, jeden wzór może mieć na myśli to Multiton pattern, gdzie możesz zarządzać mapę nazwanych wystąpień jako pary klucz-wartość.
To w zasadzie fabryki, ale każdy przypadek jest tworzony tylko raz:
Mam zmodyfikowano Wikipedia example nieco, aby pokazać, że można nawet czerpać z klasy Singleton, tak długo, jak konkretne implementacje są prywatne i w oryginalnej klasie:
class FooMultiton
{
private static readonly Dictionary<object, FooMultiton> _instances =
new Dictionary<object, FooMultiton>();
// this is the classic good old singleton trick (prevent direct instantiation)
private FooMultiton()
{ }
// you can also have private concrete implementations,
// invisible to the outside world
private class ConcreteFooMultitonOne : FooMultiton
{ }
public static FooMultiton GetInstance(object key)
{
lock (_instances)
{
FooMultiton instance;
// if it doesn't exist, create it and store it
if (!_instances.TryGetValue(key, out instance))
{
// at this point, you can create a derived class instance
instance = new ConcreteFooMultitonOne();
_instances.Add(key, instance);
}
// always return the same ("singleton") instance for this key
return instance;
}
}
}
Ponadto, jeśli singleton nie jest klasą statyczną, może implementować dowolny interfejs, który chcesz. Jedyną rzeczą, która zapobiega pojedynczemu wzorcowi, jest instancja wielu instancji klasy singleton, ale to nie znaczy, że nie możesz całkowicie zastąpić implementacji czymś innym.
Na przykład, jeśli masz singleton, który nie jest statyczne klasy:
interface ICanTalk
{
string Talk();
}
class Singleton : ICanTalk
{
private Singleton() { }
private static readonly Singleton _instance = new Singleton();
public static Singleton Instance
{ get { return _instance; } }
public string Talk()
{ return "this is a singleton"; }
}
Można również mieć szereg różnych wdrożeń:
class OtherInstance : ICanTalk
{
public string Talk()
{ return "this is something else"; }
}
to jesteś wolny, aby wybrać dowolny implementacja, jakiej potrzebujesz, ale uzyskaj tylko jedno wystąpienie klasy Singleton
:
ICanTalk item;
item = Singleton.Instance;
item = new OtherInstance();
item = new YetAnotherInstance();
Czy możesz podać przykład "pseudokodu"? –
co już wypróbowałeś? –
co powiesz na wyszukanie jednego w google lub spróbuj go utworzyć samemu –