【发布时间】:2012-03-16 03:36:04
【问题描述】:
我正在编写一个我无法控制的类库的包装器。在这个库中有一个类(我们称之为Target),我想确保它只被实例化一次,但它本身并不是一个单例。我想过像这样使用Singleton-Factory 模式:
internal sealed class SingletonFactory
{
private static readonly SingletonFactory manager = new SingletonFactory();
private readonly Target target;
private static SingletonFactory() { }
private SingletonFactory()
{
target = new Target();
target.Init("foo");
}
internal static SingletonFactory Instance
{
get { return manager; }
}
internal Target Target
{
get { return target; }
}
}
我可以这样做:
var targetInstance = SingletonFactory.Instance.Target;
然后我想通过像这样使工厂完全静态来简化这一点:
internal static class StaticFactory
{
private static readonly Target target;
private static StaticFactory()
{
target = new Target();
target.Init("foo");
}
internal static Target Target
{
get { return target; }
}
}
并且对目标实例的访问变为:
var targetInstance StaticFactory.Target;
我很确定这个StaticFactory 是线程安全的,并且提供对目标类的单个实例的全局访问。这有什么我没有想到的问题吗?
【问题讨论】:
-
您提到您对
Target没有任何控制权。您如何保证不会有人在您的工厂之外实例化Target,尤其是在Target公开的情况下? -
我正在编写的包装库将隐藏
Target来自的程序集。这是一个公司内部项目,因此该库的使用量将相当小。
标签: c# singleton factory single-instance