2013-05-28 34 views
4

自從現在一年以來,我一直在使用工廠模式。有時候我只覺得真正的優勢只是乾淨的代碼。讓我解釋一下,工廠模式的真正優勢

interface A { 

    public void test(); 
} 

class B implements A { 
    public void test() { 

    } 
} 

class C implements A { 
    public void test() { 

    } 
} 

class Factory { 
    public static A getObject(String name){ 
     if(name.equalsIgnoreCase("B")){ 
      return new B(); 
     }else if(name.equalsIgnoreCase("C")){ 
      return new C(); 
     } 
     return new B(); 

    } 
} 

public class Test { 

    public static void main(String[] args) { 
     A a = Factory.getObject(args[0]); 

     // if i dint use factory pattern 
     A nofactory=null; 
     if(args[0].equalsIgnoreCase("B")){ 
      nofactory= new B(); 
     }else if(args[0].equalsIgnoreCase("C")){ 
      nofactory= new C(); 
     } 
    } 
} 

從上面的代碼我覺得工廠模式只是美化代碼,請讓我知道如果我的理解是錯誤的。

+4

看看JDBC作爲經典學校的例子。這是一個和所有的工廠模式。它允許您通過交換JDBC驅動程序(其實現通過工廠加載)在不同的數據庫上使用相同的JDBC代碼。 – BalusC

+1

Related/possible dupe:http://stackoverflow.com/a/7550752 – BalusC

+3

問題是什麼? –

回答

2

如果接口A和類BC在圖書館和你的代碼是使用該庫的主要方法,這意味着類DE等可以添加到庫中,你可以使用它們,而無需更改碼。選擇使用哪個實現的責任被移動到庫中。

另外,你的例子非常簡單。其他時候,輸入可能比與該類型完全匹配的字符串更復雜。輸入可以是具有特定格式的文件,例如需要讀取某個特定的實現。

+0

所以從answeres我可以做出工廠模式分離創建對象的關注創建對象,這也增加了抽象 – Ashwin

+0

我不_really_得到你的意思,但是是創建對象的關注留給工廠和隱藏從其他可以信任工廠的代碼返回適當的對象。 –

1

而不是美化請看下面的例子

說你正在實施測試類和你的伴侶正在實施B,C,d ....(別人你不知道)..你怎麼能管理這個?

工廠模式可幫助您編寫應用程序的一部分,而無需知道其他部分。

0

我認爲在DP書中有意圖部分這是非常重要的甚至超過模式的結構本身。 您的示例足夠簡單。在更復雜的情況下工廠可以幫助您計算創建細節。 拿你的樣品。想象一下,你的代碼中有「新的B()」和「新的C()」。 然後,您需要更改B以說SuperB類型,您必須在代碼的每個位置更改它。 在工廠中,您只能在一個地方更換它。