工厂模式:枚举或类型?

Cas*_*nge 7 c# design-patterns

在实现工厂或简单工厂时,使用Type而不是Enum来指定要实例化的类会有什么影响?

例如

public class SimpleFactory
{
 public static ITest Create(Type type)
 {
  if (type == typeof(ConcreteTest1))
   return new ConcreteTest1();
  if (type == typeof(ConcreteTest2))
   return new ConcreteTest2();

  throw new Exception("Invalid type");
 }
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 16

使用枚举更具限制性,这意味着用户不太可能尝试使用不受支持的类型的工厂.

我发现在定义API以阻止将导致异常的使用模式时,尽可能做到最好.在这种情况下允许"类型"会打开数百万种调用函数的方法,这将导致:

throw new Exception("Invalid type");
Run Code Online (Sandbox Code Playgroud)

使用枚举将消除这一点.如果用户做了明显错误的话,枚举的唯一方法就是抛出.

  • 我绝对同意!编译时约束更容易实施且更易于使用. (2认同)

Jam*_*Ide 5

工厂仅在对您的对象执行配置或初始化以使它们处于有效状态时才有用。如果工厂所做的只是新建并返回对象,我就不会打扰它。

我会为每个类层次结构创建一个工厂。例如:

public abstract class Vehicle {}
public class Car : Vehicle {}
public class Truck : Vehicle {}

public class VehicleFactory
{
    public Vehicle CreateVehicle<T>() where T : Vehicle
    {
        // Get type of T and delegate creation to private methods
    }
}
Run Code Online (Sandbox Code Playgroud)