打破封闭原则的工厂

Sib*_*Guy 1 design-patterns

Abstract Factory/Factory方法的经典实现基于多态性.但在最低级别,我们必须有一些不基于多态性的工厂,并打破开放原则:

public Device Create(string deviceName)
{
  switch (deviceName)
  {
    case "Device1": return new Device1();
    case "Device2": return new Device2()'
    default: throw new NotSupportedDeviceException(deviceName);
  }
}
Run Code Online (Sandbox Code Playgroud)

这种工厂有什么特别的名字吗?

mik*_*nne 7

从我所看到的,您已经发布了一个完美有效的Factory Method模式示例:

  • Device1和Device2都继承/实现Device类/接口 - 多态仍然是这个例子的一个关键方面.
  • 您正在使用Factory Method来封装逻辑,以确定要实例化和返回的具体类.
  • 工厂方法的调用者仍然完全不了解所涉及的具体类 - 他只知道他找回了一个设备.这正是您希望工厂方法为您做的.

确实,内部实现有点笨拙(切换案例).但是,这并没有使它成为真正的工厂方法模式.

我真的不知道你的例子"不是基于多态",也不是"打破开放/封闭原则".如果我完全忽略了这一点,请随时更新您的帖子,以帮助我们解决您的问题.

现在,如果Factory方法正在获取传递的deviceName,并使用它来查找要实例化的具体类的完全匹配(使用反射),那将绝对打破工厂方法模式,因为调用者必须具有对该方法的深入了解.不同的具体课程.但正如目前所写,传递的deviceName只是决策过程中使用的一块数据 - 它不会破坏工厂模式的封装.


小智 6

public class Factory
{
   private Map<String, Device> devices;

    public Factory(Map<String, Device> devices)
    {
        this.devices = devices;
    }

    public Device Create(String deviceName)
    {
         return devices.get(deviceName);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用依赖注入配置映射.