gpt4 book ai didi

c# - 如何将对象创建仅限于抽象工厂类?

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:22 25 4
gpt4 key购买 nike

考虑以下类结构。

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() { }
}
}

关于c# - 如何将对象创建仅限于抽象工厂类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40071372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com