用动态构造函数替换开关



知道存储是一个接口,StorageXX是它的实现,我想知道是否可以替换以下代码...

Storage storage;
switch (storageType) {
    case "list":
        storage = new StorageList();
        break;
    case "map":
        storage = new StorageMap();
        break;
    case "db":
        storage = new StorageDB();
        break;
    default:
        throw new UnsupportedStorageTypeException();
}

。通过采用字符串参数(存储类型(的存储的"动态构造函数",在每种情况下返回我想要的实例......

存储是否应该是一个抽象类并不重要。

如果可能的话,我宁愿避免任何开关语句。

工厂模式是你应该研究的东西。它完全符合您的要求。

您可以使用工厂模式来实现这一点。

class StorageFactory
{
  public static Storage getStorage(String type)
  {
    if ( type.equals("list") )
      return new StorageList();
    else if ( type.equals("map") )
      return new StorageMap();
    else if ( type.equals("db") )
      return new StorageDb();
    throw new IllegalArgumentException();
  }
}

要创建存储列表,请执行以下操作:

Storage storage = StorageFactory.getStorage("list");

你可以创建一个从存储类型到类的映射

Map<String, Class<? extends Storage>> map = new HashMap<>();
map.put("list", StorageList.class);
map.put("map", StorageMap.class);
map.put("db", StorageDB.class);

然后通过Class使用实例化:

Class<? extends Storage> clazz = map.get(storageType);
if (clazz == null) {
    throw new UnsupportedStorageTypeException();
}
Storage storage = clazz.newInstance();

最新更新