工厂类的价值

时间:2014-01-16 17:56:06

标签: java factory-pattern

我可以理解工厂方法的价值,但我正在努力使用专用工厂的价值。

这将有效:

class Brady
{
    int age;
    String name;
    static Brady create(String who)
    {
        if(who.equals("Cindy"))  return new Cindy();
        if(who.equals("Jan"))    return new Jan();
        if(who.equals("Marcia")) return new Marcia();
        return null;
    }
}
class Marcia extends Brady {}
class Cindy extends Brady {}
class Jan extends Brady {}

...
Jan jan = (Jan)Brady.create("Jan");

那么有没有什么理由使用工厂类呢?

class Brady
{
    int age;
    String name;
}
class Marcia extends Brady {}
class Cindy extends Brady {}
class Jan extends Brady {}

class BradyFactory 
{
    static Brady create(String who)
    {
        if(who.equals("Cindy"))     return new Cindy();
        if(who.equals("Jan"))       return new Jan();
        if(who.equals("Marcia"))    return new Marcia();
        return null;
    }
}

Jan jan = (Jan)BradyFactory.create("Jan");

这似乎浪费了额外的代码。当需要实例时,我确实理解工厂类的有用性:

class BradyFactory 
{
    Brady brady;
    BradyFactory(String who)
    {
        if(who.equals("Cindy"))
            brady = new Cindy();
        else if(who.equals("Jan"))
            brady = new Jan();
        else if(who.equals("Marcia"))
            brady = new Marcia();
    }
    public BradyFactory addChore(Chore chore) 
    { 
        brady.addChore(chore);
        return this;
    }
    Brady create()
    {
        return brady;
    }
}

Jan jan = (Jan)new BradyFactory("Jan")
            .addChore(Chore.Dishes)
            .addChore(Chore.Washing)
            .create();

...或者当需要Factory的子类时。

所以我的问题是:除了需要工厂的实例或工厂子类之外,将简单工厂方法放在专用工厂中是否有任何价值?

1 个答案:

答案 0 :(得分:2)

通常,当您在不同时间插入对象的不同实现时,工厂方法将放置在单独的类中。工厂是获取对象实例的众所周知的入口点,需要始终可以找到。但是工厂可能会在多个实现中进行选择,或者通过反射动态加载它们,而调用者不知道(或关心)返回哪个实现。