考虑以下类结构。
interface IClassA
{
void methodA();
}
interface IFactoryA
{
IClassA CreateClassA();
}
class ClassA : IClassA
{
public void methodA() { }
}
class FactoryA : IFactoryA
{
public IClassA CreateClassA()
{
return new ClassA();
}
}
我想将新的 ClassA 对象的创建限制在 FactoryA 类中。如果尝试使用 new 关键字直接创建一个新的 ClassA 对象,这应该会报错。
class Program
{
static void Main()
{
IFactoryA factory = new FactoryA();
IClassA classA = factory.CreateClassA();
//I want to restrict being able to instantiate the class directly as below
IClassA newClassA = new ClassA();
}
}
如何实现?我尝试使用具有私有(private)构造函数和公共(public) getInstance 方法的修改后的单例对象,但这不是我想要的,因为客户端代码仍然可以直接调用 getInstance 方法。
将类的构造函数隐藏到外部是工厂类的核心点:
interface IClassA
{
void methodA();
}
interface IFactoryA
{
IClassA CreateClassA();
}
class ClassA : IClassA
{
internal ClassA() {}
public void methodA() { }
}
class FactoryA : IFactoryA
{
public IClassA CreateClassA()
{
return new ClassA();
}
}
现在只有定义了 ClassA
的程序集才能创建该类的实例。这假设工厂是在同一个程序集中。
但是,没有办法将对方法的访问限制为只有一个类或方法。
正如 Lee 所指出的,您还可以将类嵌套到工厂中:
class FactoryA : IFactoryA
{
public IClassA CreateClassA()
{
return new ClassA();
}
class ClassA : IClassA
{
public void methodA() { }
}
}
我是一名优秀的程序员,十分优秀!