Change log
Home
Singleton pattern
Links
|
Een thread-safe singleton baseclass in C# met SingletonFactory.
(versie 2)
namespace DesignPatterns
{
public interface ISingleton
{
// not much
}
internal class SingletonException : Exception
{
public SingletonException(string message): base(message){}
}
public class SingletonFactory
{
static private Hashtable singletonTable = new Hashtable();
static private TypeFilter singletonFilter = new TypeFilter(SingletonInterfaceFilter);
private static bool SingletonInterfaceFilter(Type typeObject, Object criteriaObject)
{
if(typeObject.ToString() == criteriaObject.ToString())
return true;
else
return false;
}
static protected ISingleton Instance(Type singletonType)
{
Object _singleton = null;
string WarningsMessage = ": class must implement ISingleton interface";
Type[] singletonInterfaces = singletonType.FindInterfaces(singletonFilter
, "DesignPatterns.ISingleton");
if (singletonInterfaces.Length == 0)
throw new SingletonException(singletonType.ToString() + WarningsMessage);
Mutex mutex = new Mutex();
mutex.WaitOne();
_singleton = singletonTable[singletonType];
if (_singleton == null)
{
_singleton = Activator.CreateInstance(singletonType);
singletonTable.Add(singletonType, _singleton);
}
mutex.Close();
return _singleton as ISingleton;
}
}
}
Een SingletonFactory implementatie.
using DesignPatterns;
namespace MyDesignPatterns
{
public interface IMyBaseSingleton : ISingleton
{
string name { get; set; }
}
public interface ISingletonA : IMyBaseSingleton
{
// ISingletonA interface definitions
}
public interface ISingletonB : IMyBaseSingleton
{
// ISingletonB interface definitions
}
internal class MyBaseSingleton : IMyBaseSingleton
{
private string _name;
public string name { get {return _name;} set {_name = value;}}
}
internal class SingletonA : MyBaseSingleton, ISingletonA
{
// SingletonA implementation
}
internal class SingletonB : MyBaseSingleton, ISingletonB
{
// SingletonB implementation
}
public class MySingletonFactory : SingletonFactory
{
public MySingletonFactory()
{
}
static public ISingletonA singletonA()
{
return Instance(typeof(SingletonA)) as ISingletonA;
}
static public ISingletonB singletonB()
{
return Instance(typeof(SingletonB)) as ISingletonB;
}
}
}
En een stukje code om te zien wat het doet.
private string PerformTest()
{
ISingletonA TestSingletonA = MySingletonFactory.singletonA();
ISingletonB TestSingletonB1 = MySingletonFactory.singletonB();
ISingletonB TestSingletonB2 = MySingletonFactory.singletonB();
TestSingletonB2.name = "B2";
TestSingletonB1.name = "B1";
TestSingletonA.name = "A";
return "value of name in A/B1/B2 : "
+ TestSingletonA.name + "/"
+ TestSingletonB1.name + "/"
+ TestSingletonB2.name;
}
|
Top |
17 oktober 2004 |
Download gerepareerd. |
9 oktober 2004 |
Sample applicatie om te dowloaden toegevoegd.
|
6 oktober 2004 |
Versie met 1 verhoogd. Singleton
code versie 1
Singleton via interface teruggeven vanuit de factory.
Alleen voorbeeld code die van toepassing is tonen.
|
2 oktober 2004 |
CSharp Singleton code page naar nieuwe url overgezet, design aangepast. |
|
|
21-04-2018/22-11-2024
|