2015-09-07 96 views
0

我實現了Factory Method模式,但是檢查了幾個例子,我無法確定擴展產品的具體類而不是創建抽象類或接口是否正確......僅僅用於示例(PHP)。非抽象產品的方法工廠

所以,我有我的抽象工廠和他們的具體工廠:

interface BookFactoryInterface 
{ 
    public function createBook(); 
} 

class ElectronicBookFactory implements BookFactoryInterface 
{ 
    public function createBook() 
    { 
     return new ElectronicBook(); 
    } 
} 

class PaperBookFactory implements BookFactoryInterface 
{ 
    public function createBook() 
    { 
     return new PaperBook(); 
    } 
} 

現在我已經看到了所有的例子是通常的產品從抽象類或接口擴展,但是當我測試我意識到在我的情況下並不需要那個,我需要的是一個具有共同行爲的具體類,然後是我的其餘子類。

class Book 
{ 
    /* 
     All properties like title, authors, publicationDate 
     here, with the corresponding methods. 
    */ 
} 

class ElectronicBook extends Book 
{ 
    //... 
} 

class PaperBook extends Book 
{ 
    //... 
} 

的類的實例仍然被導出到子類,所以我真的相信這是一個工廠方法實現,但我能找到這樣的另一個示例代碼。

所以問題是:這仍然是一個工廠方法的實現?如果不是爲什麼?

回答

0

這是非常主觀的,但我會爭辯說,你不需要任何繼承,因爲它是一個工廠方法。這實際上足以滿足定義:

class Book { 

} 

class BookFactory { 

    function createBook() { 

    return new Book();  

    } 

} 
1

需要爲抽象(使用接口或抽象類)來的時候,你需要改變的代碼創建的具體對象。當情況出現時,這尤其有用,例如在編寫單元測試時,或者您需要添加更少的產品(或/和)創建者。

有趣的是知道工廠和工廠的方法有所不同。工廠是將創造部分封裝到具有照顧創造部分的方法的類中的方式。另一方面,工廠方法被賦予「創造者」創造「產品」,可以由創作者決定。創建產品的方法,比如說createProduct(),通常在Creator中(通過繼承來引發),其他方法的意圖通常是由Factory Method創建的產品。

現在,在創作者和產品中,我們使用了一種並行的層次結構,以便創作者不依賴(或知道產品是如何創建的)混凝土產品,產品也不知道創作者。這有助於實現鬆散耦合的代碼(這裏,CHANGE不會互相影響)。

希望這會有所幫助。

你可以讀到更多在: