原文鏈接:
http://tianweili.github.com/blog/2015/03/08/simple-factory-pattern/
介紹簡單工廠模式屬于創建型模式,又叫做靜態工廠方法(static factory method)。但是它并沒有歸為23種GOF設計模式其中。
簡單工廠模式是由工廠對象來決定創建哪一種產品類的實例。
簡單說就是工廠對象根據傳入的參數,動態的決定創建哪一種產品類的實例,而這些產品類繼承自一個父類或一個接口。
UML類圖簡單工廠模式的一個基本的UML類圖如下所示:
{% img /simple-factory-patternsimple-factory-uml.png %}
在這個UML類圖中包含以下角色:
工廠(Factory)
這是簡單工廠模式的核心,由它來負責實現創建所有實例的邏輯。工廠對象用來被外界調用,根據傳入的參數來決定創建哪一個產品對象。
抽象產品(Abstract PRoduct)
抽象類或接口。是所有具體產品對象的父類,由它來定義所有具體產品的公共接口。
具體產品(Concrete Product)
具體產品是簡單工廠模式的創建目標,所有創建的對象都是某個具體產品類的實例。
代碼示例public interface Product { public void function();}public class ProductA implements Product{ @Override public void function() { System.out.println("ProductA function ..."); }}public class ProductB implements Product{ @Override public void function() { System.out.println("ProductB function ..."); }}public class Factory { public Product create(String productName) { if (productName == null || "".equals(productName)) { return null; } if ("productA".equals(productName)) { return new ProductA(); } else if ("productB".equals(productName)) { return new ProductB(); } return null; }}public class Main { public static void main(String[] args) { Factory factory = new Factory(); Product product1 = factory.create("productA"); Product product2 = factory.create("productB"); product1.function(); product2.function(); }}輸出結果:
ProductA function ...ProductB function ...優點客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。
外界不用關注對象創建邏輯,產品對象具體的創建過程由工廠來實現。外界直接給定信息來決定創建哪個產品對象。
明確了各自的職責,有利于整個軟件體系結構的優化。
缺點違反高內聚責任分配原則,將所有的創建邏輯都集中在了工廠類身上。
如果需要添加新的產品類,則需要修改工廠類。
當產品類不斷增多,工廠類對產品類型的判斷條件過多交織在了一起,會造成邏輯過于復雜,對系統的擴展和維護不利。
使用場景工廠類創建的產品對象比較少。
外界只需要傳入工廠類參數來獲得產品對象,對于產品對象的創建過程不關心。
簡單工廠模式很容易違反高內聚責任分配原則,所以只是在一些很簡單的情況下使用。
應用實例附件的解壓在工作中,有一個項目模塊中要求的功能是:登錄郵箱,獲取郵件,然后抓取郵件中的附件,下載下來,如果是壓縮包,則進行解壓,然后進行相應處理。在解壓時就用到了簡單工廠模式。附件壓縮包格式不一,有zip,rar等格式,則把每一種格式的解壓和處理都放到一個產品對象中,然后使用一個工廠類來決定創建哪一個產品進行相應的處理。
由于這個壓縮包解壓方式并不多,判斷邏輯并不太復雜,所以也沒必要用工廠方法模式,增加代碼復雜度。
作者:李天煒
原文鏈接:http://tianweili.github.com/blog/2015/03/08/simple-factory-pattern/
轉載請注明作者和文章出處,謝謝。
新聞熱點
疑難解答