简单工厂 - 如何改善这一点

时间:2015-06-17 22:35:00

标签: design-patterns

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检查逻辑。

3 个答案:

答案 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);
    }
}

Useful link

答案 2 :(得分:0)

非常依赖于背景。 如果你只是想要一个包装器,只需传递一个扩展可压缩接口的对象并将其包装起来。

public interface Wrappable { public Wrapped wrap() }

public class Factory {
    static WrappedObj create(Wrappable model) {
        return model.wrap();
     }
}