c# - 工厂模式、另一种模式还是根本没有模式?

标签 c# oop design-patterns factory-pattern

我有2个方法可以被认为是工厂设计模式的案例,这个例子是在C#中,altought,可以适用于其他编程语言:

enum NinjaTypes {
  Generic,
  Katanna,
  StarThrower,
  Invisible,
  Flyer
}

public class Ninja {
  public string Name { get; set; }
  public void jump() { ... }
  public void kickAss() { ... }
}

public class KatannaNinja: Ninja {
  public void useKatanna() { ... }
}

public class StarNinja: Ninja {
  public void throwStar() { ... }
}

public class InvisibleNinja: Ninja {
  public void becomeInvisible() {...}
  public void becomeVisible() {...}
}

public class FlyNinja: Ninja {
  public void fly() {...}
  public void land() {...}
}

public class NinjaSchool {
  // always return generic type
  public Ninja StandardStudent() {...}
  // may return other types
  public Ninja SpecialityStudent(NinjaTypes WhichType) {...}
}

方法 StandardStudent() 总是返回一个相同类型的新对象,SpecialityStudent(...) 可能返回来自共享相同类型的不同类的新对象相同的父类(super class)/基类型。这两种方法都不是虚拟的。

问题是,这两种方法都是“工厂设计模式”吗?

我的猜测是 SpecialityStudent(...) 是,但 StandardStudent() 不是。如果第二种不是,可以考虑另一种设计模式吗?

最佳答案

我不认为那也不 FactoryMethod `也不AbstractFactory模式禁止用户使用参数为创建者方法指定类型。无论如何,您应该在设计中至少考虑两件事:

  1. 工厂方法有助于使客户不知道所创建对象的具体类型。从我的角度来看,明确指定要创建的对象的类型并没有错,但要注意不要在客户端类上投入太多知识,以至于无法通过工厂构造对象。
  2. 您的两个工厂方法都返回一个 Ninja 对象,但是您的一些 ninjas 扩展类声明了其他方法,而客户端并不知道这些方法。如果您的客户需要显式使用这些方法,那么您可能需要在设计上做出一些考虑。

关于c# - 工厂模式、另一种模式还是根本没有模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6542259/

相关文章:

c# - 将 XhtmlTextWriter 与 XmlTextReader 结合使用

c# - 在 .Net 中将 1,00 转换为 100

对象引用的 Java 哈希表问题

go - 池模式和原型(prototype)模式有什么区别?

ios - UIKit 背后的设计模式

java - 不使用方法参数的接口(interface)实现

c# - 如何像保存图像一样保存 Canvas

java - 静态内部类与 Companion 的内部类

java - 如何在java中通过递归连接字符串生成方程?

c# - 使用自定义命名空间获取 XML 中的子节点