2014-01-16 75 views
-1

我可以欣賞工廠方法的價值,但我正在努力使用專用工廠類別的價值。工廠類別的價值

這將工作:

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(); 

......或者需要工廠的子類時。

所以我的問題是:除了需要工廠實例或工廠子類時,將簡單工廠方法放在專用工廠中是否有任何價值?

+0

http://stackoverflow.com/questions/69849/factory-pattern-when-to-use-factory-methods – zmf

+1

你確定這是factroy模式?看起來很像建築師模式! – fabian

+0

我的想法正是@fabian!我在爲自己掙扎,忘記了工廠模式!? –

回答

2

通常,當您要在不同的時間插入對象的不同實現時,工廠方法會放置在單獨的類中。工廠是獲取對象實例的着名入口點,並且需要始終可找到。但是工廠可能會在多個實現中進行選擇,或者通過反射動態加載它們,而調用者不知道(或關心)返回哪個實現。