原文連接:java
http://tianweili.github.com/blog/2015/03/08/simple-factory-pattern/git
簡單工廠模式屬於建立型模式,又叫作靜態工廠方法(static factory method)。可是它並無歸爲23種GOF設計模式其中。github
簡單工廠模式是由工廠對象來決定建立哪種產品類的實例。設計模式
簡單說就是工廠對象根據傳入的參數,動態的決定建立哪種產品類的實例,而這些產品類繼承自一個父類或一個接口。ide
簡單工廠模式的一個基本的UML類圖以下所示:優化
{% img /simple-factory-patternsimple-factory-uml.png %}設計
在這個UML類圖中包含如下角色:code
工廠(Factory)對象
這是簡單工廠模式的核心,由它來負責實現建立全部實例的邏輯。工廠對象用來被外界調用,根據傳入的參數來決定建立哪個產品對象。blog
抽象產品(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/
轉載請註明做者和文章出處,謝謝。