1. 程式人生 > >設計模式(建立型)之簡單工廠模式(Simple Factory Pattern)

設計模式(建立型)之簡單工廠模式(Simple Factory Pattern)

PS一句:最終還是選擇CSDN來整理髮表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown語法了,牛逼啊!

概述

簡單工廠模式(Simple Factory Pattern)又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。當你需要什麼,只需要傳入一個正確的引數,就可以獲取你所需要的物件,而無須知道其建立細節。

通常脫口而出所說的工廠模式是指工廠方法模式,它是幾種工廠模式裡使用頻率最高的模式。而這裡先不說工廠方法模式,先來說說工廠模式系列中不屬於設計模式的一種模式–簡單工廠模式。它不屬於設計模式,但在軟體開發中應用也較為頻繁,通常將它作為學習其他工廠模式的入門。其實工廠模式分為了最弱的簡單工廠模式,工廠方法模式,牛逼的抽象工廠模式。

切記,簡單工廠模式不屬於設計模式,是一種編碼的習慣,但他又和工廠模式有些關係,所以先說。

核心

概念: 定義一個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用於建立例項的方法是靜態(static)方法,因此簡單工廠模式又被稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。

重點: 簡單工廠模式的結構包含如下幾個核心模組:

Factory(工廠角色)

工廠角色即工廠類,它是簡單工廠模式的核心,負責實現建立所有產品例項的內部邏輯;工廠類可以被外界直接呼叫,建立所需的產品物件;在工廠類中提供了靜態的工廠方法,返回型別為抽象產品型別。

Product(抽象產品角色)

工廠類所建立的所有物件的父類,封裝了各種產品物件的公有方法,它的引入將提高系統的靈活性,使得在工廠類中只需定義一個通用的工廠方法,因為所有建立的具體產品物件都是其子類物件。

ConcreteProduct(具體產品角色)

簡單工廠模式的建立目標,所有被建立的物件都充當這個角色的某個具體類的例項。每一個具體產品角色都繼承了抽象產品角色,需要實現在抽象產品中宣告的抽象方法。

特例: 有時候,為了簡化簡單工廠模式,我們可以將抽象產品類和工廠類合併,將靜態工廠方法移至抽象產品類中。

在簡單工廠模式中,客戶端通過工廠類來建立一個產品類的例項,而無須直接使用new關鍵字來建立物件。

使用場景

工廠類負責建立的物件比較少。

客戶端只知道傳入工廠類的引數,對於如何建立物件並不關心。

程式猿例項

如下以程式猿技能為例使用簡單工廠模式寫程式碼,ICode就是抽象產品角色,CodeImplAndroid、CodeImplIOS、CodeImplPHP等將來新增的就是具體產品角色,FactoryCreater就是工廠角色。Main方法是客戶端模擬調運。

package yanbober.github.io;

interface ICode {
    void coding();
}

class CodeImplAndroid implements ICode {
    @Override
    public void coding() {
        System.out.println("Coding Android!");
    }
}

class CodeImplIOS implements ICode {
    @Override
    public void coding() {
        System.out.println("Coding IOS!");
    }
}

class CodeImplPHP implements ICode {
    @Override
    public void coding() {
        System.out.println("Coding PHP!");
    }
}

class FactoryCreater {
    public static ICode getCodingSkill(String type) {
        ICode iCode = null;
        if ("android".equalsIgnoreCase(type)) {
            iCode = new CodeImplAndroid();
        }
        else if ("ios".equalsIgnoreCase(type)) {
            iCode = new CodeImplIOS();
        }
        else if ("php".equalsIgnoreCase(type)) {
            iCode = new CodeImplPHP();
        }
        return iCode;
    }
}

public class Main {
    public static void main(String[] args) {
        ICode code = FactoryCreater.getCodingSkill("php");
        code.coding();
        code = FactoryCreater.getCodingSkill("android");
        code.coding();
        code = FactoryCreater.getCodingSkill("ios");
        code.coding();
    }
}

技巧Tips: 其實在Android開發中有時候會設計客戶化等操作,可能會用到簡單工廠方法,在使用FactoryCreater的type時會發現,在程式碼中通過FactoryCreater.getCodingSkill(“php”);修改php這種type時都需要重新編譯程式碼;每次修改FactoryCreater.getCodingSkill(“php”);的類都違背了開閉原則。所以有一個技巧解決這些問題,使用配置檔案,在FactoryCreater中傳入配置檔案的值即可解決這種開閉原則。

總結一把

簡單工廠模式的主要優點如下:

  • 客戶端可以免除直接建立物件的職責,只關心使用物件,簡單工廠模式實現了物件建立和使用的分離。
  • 客戶端不用知道建立的產品類具體類名,只要知道具體產品類所對應的引數即可。
  • 通過配置檔案,提高了系統靈活性。

簡單工廠模式的主要缺點如下:

  • 工廠類負責所有物件的建立邏輯,該類出問題整個系統掛掉。
  • 系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯。
  • 簡單工廠模式由於使用了靜態工廠方法,所以工廠角色無法形成基於繼承的等級結構。