1. 程式人生 > >【設計模式】簡單工廠模式(Simple Factory)

【設計模式】簡單工廠模式(Simple Factory)

思想

簡單工廠模式,因為用於建立例項的方法是靜態的,又稱為靜態工廠方法模式。在該模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有相同的父類。

結構

組成(角色) 作用
工廠(Factory) 根據傳入不同引數從而建立具體產品類的例項
抽象產品(Product) 描述產品的公共介面
具體產品(Concrete Product) 描述生產的具體產品

類圖


實現

1、抽象產品類

abstract class Product {
    //所有產品類的公共業務方法
    public void methodSame() {
        //公共方法的實現
    }

    //宣告抽象業務方法
    public abstract void methodDiff();
}

2、具體產品類

class ConcreteProduct extends Product {
    //實現業務方法
    public void methodDiff() {
        //業務方法的實現
} }

3、工廠類

class Factory {
    //靜態工廠方法
    public static Product getProduct(String arg) {
        Product product = null;
        if (arg.equalsIgnoreCase("A")) {
            product = new ConcreteProductA();
            //初始化設定product
        }
        else if (arg.equalsIgnoreCase("B")) {
            product =
new ConcreteProductB(); //初始化設定product } return product; } }

4、客戶端類

class Client {
    public static void main(String args[]) {
        Product product; 
        product = Factory.getProduct("A"); //通過工廠類建立產品物件
        product.methodSame();
        product.methodDiff();
    }
}

分析

1、優點

  • 工廠類含有必要的判斷邏輯,可以決定在什麼時候建立哪一個產品類的例項,客戶端可以免除直接建立產品物件的責任,而僅僅“消費”產品;簡單工廠模式通過這種做法實現了對責任的分割,它提供了專門的工廠類用於建立物件。
  • 客戶端無須知道所建立產品類的類名,只需要知道具體產品類對應的引數即可,對於一些複雜的類名,通過簡單的工廠模式可以減少使用者的記憶量。
  • 通過引入配置檔案,可以在不修改任何客戶端程式碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。
  • 當需要引入新的產品是不需要修改客戶端的程式碼,只需要新增相應的產品類並修改工廠類就可以了,所以說從產品的角度上簡單工廠模式是符合“開-閉”原則的。

2、缺點

  • 由於工廠類集中了所有產品建立邏輯,一旦不能正常工作,整個系統都要受到影響。
  • 使用簡單工廠模式將會增加系統中類的個數,在一定程式上增加了系統的複雜度和理解難度。
  • 系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯,在產品型別較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴充套件和維護。
  • 簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構。

3、適用環境

  • 工廠類負責建立的物件比較少:由於建立的物件較少,不會造成工廠方法中的業務邏輯太過複雜。
  • 客戶端只知道傳入工廠類的引數,對於如何建立物件不關心:客戶端既不需要關心建立細節,甚至連類名都不需要記住,只需要知道型別所對應的引數。

4、應用

  • java.text.DateFormat

用於格式化一個本地日期或者時間。

public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale locale);
  • 加密技術

獲取不同加密演算法的祕鑰生成器

KeyGenerator keyGen=KeyGenerator.getInstance("DESede");

建立密碼器

Cipher cp=Cipher.getInstance("DESede");

參考