class MyConcreteFactory
{
public static function create($model, $typeId)
{
if ($typeId == 'customer') {
return new CustomerWrapper($model);
}
if ($typeId == 'order') {
return new OrderWrapper($model);
}
if ($typeId == 'product') {
return new ProductWrapper($model);
}
}
}
我怎样才能改善这一点?主要缺陷是每次引入或更改新的实体类型时,都需要更改管理typeId检查逻辑。
答案 0 :(得分:2)
这取决于您使用的语言提供的设施。一种方法是读取字符串以从配置文件中键入映射。
class MyConcreteFactory
{
private Map(string, constructor) KnownTypes = ReadFromConfig();
public static function create($model, $typeId)
{
var constructor = KnownTypes($typeId);
var result = constructor($model);
return result;
}
}
答案 1 :(得分:0)
在java中,您可以借助Reflection API改进模式。
public class Example {
public static Object create(Class c) {
try {
//Creating a new instance with the default constructor of that Class
return c.newInstance();
} catch (Exception e) {e.printStackTrace();}
return null;
}
public static void main(String[] args) {
//For example: Instantiating a HashMap
HashMap hashMap = (HashMap) create(HashMap.class);
}
}
答案 2 :(得分:0)
非常依赖于背景。 如果你只是想要一个包装器,只需传递一个扩展可压缩接口的对象并将其包装起来。
public interface Wrappable { public Wrapped wrap() }
public class Factory {
static WrappedObj create(Wrappable model) {
return model.wrap();
}
}