2012-02-03 83 views
3

可能重复:
Factory pattern in C#: How to ensure an object instance can only be created by a factory class?我可以限制哪些类可以实例化另一个类?

假设我有一个知道如何使广场的工厂类。如果我觉得只有Factory类知道如何制作一个正方形,并且我想阻止其他人(即使在同一个装配中)创建一个Square,那么正确的方式(如果有这样的事情的话)可以去解决吗?

+0

使构造函数为私有,工厂类为Square的嵌套类型:http://stackoverflow.com/a/515288/ 284240 – 2012-02-03 10:27:45

+1

感谢蒂姆,但不工作这么好,当我要添加三角形和菱形...... – 2012-02-03 11:23:04

回答

2

你可以在工厂和类移动到组装和纪念类的构造函数内部,使其只能从组件内调用。

请注意,这将允许其他组件成员虽然访问的构造,不仅工厂。

这是怎么Lookup<TKey, TElement>作品实例。我看到(与工厂,并在同一组件上的Square

+0

也许我会解决最终使用。我想在某些时候,如果我真的想要如果有人滥用它,我可以使用一些反射来在运行时抛出异常。 – 2012-02-03 11:25:25

2

一种方式是将你的工厂方法为Square类的静态方法,并添加只有私有构造您Square类。

您也可以将您的Factory类作为一个内部类的Square

public class Square 
{ 
    private Square() 
    { 
    } 

    public int Size { get; set; } 

    public static class Factory 
    { 
     public static Square CreateClass() 
     { 
      return new Square { Size = 10 }; 
     } 
    } 
} 
5

根据你的情况,你可以这样做:

public class Square 
{ 
    // Only Square and classes nested within it can call this 
    private Square() 
    { 
    } 

    public class Factory 
    { 
     public Square CreateSquare() 
     { 
      return new Square(); 
     } 
    } 
} 

然后:

Square.Factory factory = new Square.Factory(); 
Square square = factory.CreateSquare(); 
+1

如果我要做到这一点,岂不更有意义有广场是内部类,这样我可以为圆形或三角形一样吗?这显然向后似乎我,但我看到别人发布了同样的答案,因此让我好奇,如果我在这里失去了一些东西... – 2012-02-03 10:38:46

+0

@BrandonMoore:它不会在这种情况下工作,作为含类不有权访问嵌套类的私有成员。我们需要知道一个更现实的场景,基本上 - 这种模式非常有用(特别是对于实现Builder模式),但它不是*通用*适用的。 – 2012-02-03 10:56:20

+0

哦,对,我知道。奇怪的是,我认为我听说根据规范,内部类不应该访问外部类的私有成员......但是由于C#和其他编译器有用,所以它仍然允许它。 – 2012-02-03 11:01:42

相关问题