我们说我有一个Apple Class
和一个AppleFactory
类。
没有人应该能够使用Apple redApple = new Apple()
。相反,新的苹果应该只能从AppleFactory.Create()
创建。
这意味着除了AppleFactory Class之外,所有人都无法访问Apple的构造函数。
如何做到这一点?
编辑:Apple
更像是AppleModel
。所以那里只有属性。
答案 0 :(得分:2)
如果您想要其他类型作为工厂,那么您可以获得的最接近的是internal
:
public sealed class Apple() {
internal Apple() {}
}
public class AppleFactory() {
public Apple CreateApple() => new Apple();
}
但是,如果您可以在Apple
上将工厂作为静态方法,那么您可以保留所有内容private
:
public sealed class Apple() {
private Apple() {}
public static Apple Create() => new Apple();
}
答案 1 :(得分:1)
您可以将Apple
抽象化,然后在private
中创建AppleFactory
子类。
但是,您无法阻止其他人创建自己的子类。
答案 2 :(得分:1)
您可以让Apple
课程成为自己的工厂。
public class Apple
{
private Apple()
{}
internal static Apple Create()
{
var apple = new Apple();
// TODO: Initialize
return apple;
}
}
真正的Apple工厂可以调用此工厂方法:
public class AppleFactory() {
public CreateApple() => Apple.Create();
}
通过使Apple.Create()
内部,您可以将其使用限制为当前程序集。构造函数只能在ins Apple
中调用,因为它是private
。