Factory Pattern可以构建许多派生类

gdb*_*dbj 7 c# design-patterns factory-pattern

我有一个工厂对象ChallengeManagerChallenge为我正在构建的游戏生成一个对象的实例.有很多挑战.每个Challenge类派生的构造函数是不同的,但是它们之间有一个共同的接口,在基类中定义.

当我调用时manager.CreateChallenge(),它返回一个实例Challenge,它是派生类型之一.

理想情况下,我想在派生类本身内保留对象构造的代码,因此与该对象相关的所有代码都是共存的.例:

class Challenge {}

class ChallengeA : Challenge {
  public static Challenge MakeChallenge() {
    return new ChallengeA();
  }
}

class ChallengeB : Challenge {
  public static Challenge MakeChallenge() {
    return new ChallengeB();
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我的ChallengeManager.CreateChallenge()通话只需要决定要呼叫的课程MakeChallenge().构造的实现包含在类本身中.

使用此范例,每个派生类都必须定义静态MakeChallenge()方法.但是,由于该方法是静态的,我不能在这里使用接口,需要它.

这不是什么大问题,因为我可以很容易地记住为每个派生类添加正确的方法签名.但是,我想知道是否应该考虑更优雅的设计.

Eri*_*ert 22

我非常喜欢你描述的模式并经常使用它.我喜欢这样做的方式是:

abstract class Challenge 
{
  private Challenge() {} 
  private class ChallengeA : Challenge 
  {
    public ChallengeA() { ... }
  }
  private class ChallengeB : Challenge 
  {
    public ChallengeB() { ... }
  }
  public static Challenge MakeA() 
  {
    return new ChallengeA();
  }
  public static Challenge MakeB() 
  {
    return new ChallengeB();
  }
}
Run Code Online (Sandbox Code Playgroud)

这种模式有很多不错的属性.没有人可以创新,Challenge因为它是抽象的.没有人可以创建派生类,因为Challenge默认的ctor是私有的.没有人可以得到ChallengeAChallengeB因为他们是私人的.您定义了接口Challenge,这是客户端需要理解的唯一接口.

当客户想要一个A,他们要求Challenge一个,他们得到它.他们不需要担心幕后的事实A是由实现的ChallengeA.他们只是得到了Challenge他们可以使用的东西.

  • @AlexanderDerck:有些人认为公共嵌套类是一种不好的做法; 嵌套类感觉有点奇怪,因为人们不习惯将类视为其他东西的成员(除了名称空间).所以我会谨慎地以这种方式调整这种模式; 有些人可能会觉得奇怪. (2认同)