設計模式(一):簡單工廠模式
阿新 • • 發佈:2020-12-25
模式動機
做過Web開發的開發者都知道,在將使用者的密碼儲存在資料庫中時,我們需要將密碼首先加密然後在寫入資料庫。 在Java中,我們常用的加密手段有MD5、RSA等。我們使用的程式碼是:
KeyPairGenerator.getInstance("RSA");
如果我們需要使用MD5時傳入的引數就是MD5。這裡,就是我們今天需要講解的簡單工廠模式。
模式定義
簡單工廠模式又稱為靜態工廠模式,這個模式資料建立式模式。在簡單工廠模式中,根據傳入的引數,返回不同類的例項。
模式結構
簡單工廠模式包含如下角色:
1.Factory:工廠角色
工廠角色負責實現建立所有例項的內部邏輯
2.Product:抽象產品角色
抽象產品角色是所建立的所有物件的父類,負責描述所有例項所共有的公共介面
3.ConcreteProduct:具體產品角色
具體產品角色是建立目標,所有建立的物件都充當這個角色的某個具體類的例項。
程式碼示例
這裡我們首先建立一個抽象物件Product:
package cn.edu.hust.simpleFactory;
public abstract class Product {
public abstract void use();
}
然後建立兩個實現類ProductA和ProductB
package cn.edu.hust.simpleFactory;
public class ProductA extends Product
{
@Override
public void use() {
System.out.println("using ProductA");
}
}
package cn.edu.hust.simpleFactory;
public class ProductB extends Product {
public void use() {
System.out.println("using productB");
}
}
最後建立一個工廠類
package cn.edu.hust.simpleFactory;
public class ProductFactory {
public Product createProduct(String productType)
{
if("ProductA".equals(productType))
{
return new ProductA();
}
else
{
return new ProductB();
}
}
工廠類根據引數返回不同的實現類。
模式優點
- 工廠類含有必要的判斷邏輯,可以決定在什麼時候建立哪一個產品類的例項,客戶端可以免除直接建立產品物件的責任,而僅僅“消費”產品;簡單工廠模式通過這種做法實現了對責任的分割,它提供了專門的工廠類用於建立物件。
- 客戶端無須知道所建立的具體產品類的類名,只需要知道具體產品類所對應的引數即可,對於一些複雜的類名,通過簡單工廠模式可以減少使用者的記憶量。
- 通過引入配置檔案,可以在不修改任何客戶端程式碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。
模式缺點
- 由於工廠類集中了所有產品建立邏輯,一旦不能正常工作,整個系統都要受到影響。
- 使用簡單工廠模式將會增加系統中類的個數,在一定程式上增加了系統的複雜度和理解難度。
- 系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯,在產品型別較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴充套件和維護。
- 簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構。
模式應用
JDK類庫中廣泛使用了簡單工廠模式,如工具類java.text.DateFormat,它用於格式化一個本地日期或者時間。
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale locale);
- Product:抽象產品角色抽象產品角色是所建立的所有物件的父類,負責描述所有例項所共有的公共介面具體產品角色是建立目標,所有建立的物件都充當這個角色的某個具體類的例項。
原文:https://github.com/oeljeklaus-you/Design-Patterns/blob/master/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F(%E4%B8%80)%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F.md