簡單工廠模式--SimpleFactory

TigerChain發表於2017-11-04

simply_factory.png
simply_factory.png

版權宣告:本文為博主原創文章,未經博主允許不得轉載

PS:轉載請註明出處
作者: TigerChain
地址: www.jianshu.com/p/36fe35ad7…
本文出自 TigerChain 簡書 Android 設計模式系列

教程簡介

  • 1、閱讀物件
    本篇教程適合新手閱讀,老手直接略過
  • 2、教程難度
    初級
  • 3、Demo 地址
    稍後 提供

正文

一、什麼是簡單工廠

1、 生活中的工廠

簡單工廠,從字面意思也能理解出來,就是一個很簡單的工廠「W T F」,說了等於沒有說是吧。我們先說說工廠吧

工廠就是一個製造廠,在生活中工廠太多太多了,比如車廠就是用來造車的,雙匯就是出火腿腸的「當然不只是火腿」,菸草廠就是製作和加工香菸的,等等。

生活中的這些工廠是如何工作的呢?比如雙匯製作火腿腸,肯定是把肉送進去,根據若干程式最後出來就是火腿。「如果想要雞肉腸,那麼加點雞肉,玉米的加點玉米」,也就是說給定一些原材料「玉米、肉」出來的就是玉米腸,也就是說工廠就是輸入東西----然後製造出我想要的東西「至於你怎麼樣製造的,我管你呢」

2、 程式中的工廠

程式是源於生活的,所以程式中的工廠和生活中的工廠非常類似,生活工廠中的產品非常多,但是在程式中工廠的作用就是創造物件。

簡單工廠模式定義

簡單工廠模式又稱為靜態工廠模式,簡單工廠模式的作用就是建立一個工廠類用來建立其它類的例項,至於類是怎麼樣建立的對使用者來說是不可見的「遮蔽細節」

簡單工廠模式結構

角色 類別 說明
Product 產品類 一般是一個抽象類或是介面
ConcreteProduct 具體的產品類 實現或是繼承 Product
Factory 工廠類 用來建立具體的產品

簡單工廠模式的 UML 圖

簡單工廠 UML
簡單工廠 UML

二、簡單工廠舉例

比如我有蘋果、桔子、等水果,然後有一個榨汁機,我給一個蘋果就給我榨出蘋果汁,給桔子就出桔汁。

分析一下:

在這個例子中,果汁就是我們的產品,而蘋果汁,桔子汁就是我們的具體的產品,榨汁機就是我們的工廠,而蘋果,桔子等水果就是我們輸送的原材料

寫程式碼

寫程式碼之前先看看榨汁機工廠的 UML 圖

榨汁機工廠
榨汁機工廠

  • 1、定義抽象產品果汁介面 IJuice.java
/**
 * @Description 建立一個果汁介面
 * @Creator TigerChain(建立者)
 */
public interface IJuice {
    String getName() ;
    //也可以宣告一些其它的業務方法
}複製程式碼
  • 2、定義具體的產品,蘋果汁「AppleJuice.java」,桔汁「OrangeJuice.java
# AppleJuice.java

/**
 * @Description 一個具體的產品--- 蘋果汁
 * @Creator TigerChain(建立者)
 */
public class AppleJuice implements IJuice {

    public static final String TAG = "AppleJuice" ;

    @Override
    public String getName() {
        Log.e(TAG,"我是蘋果汁") ;
        return "我是蘋果汁";
    }
}複製程式碼
# OrangeJuice.java

/**
 * @Description 具體的產品桔子汁
 * @Creator TigerChain(建立者)
 */
public class OrangeJuice implements IJuice {

    public static final String TAG = "OrangeJuice" ;

    @Override
    public String getName() {
        Log.e(TAG,"我是桔子汁") ;
        return "我是桔子汁";
    }
}複製程式碼
  • 3、建立榨汁機「工廠類」 JuiceFactory.java

/**
 * @Description  果汁機---工廠
 * @Creator junjun(建立者)
 */
public class JuiceFactory {

    /**
     * 根據名稱來生產不同的果汁
     * @param name
     * @return
     */
    public static IJuice createJuice(String name){
        IJuice iJuice = null;
        if(name.equals("apple")){
            //蘋果汁
            iJuice = new AppleJuice() ;
        }else if(name.equals("orange")){
            //桔子汁
            iJuice = new OrangeJuice() ;
        }

        return iJuice ;
    }
}複製程式碼
  • 4、在 MainActivity 中使用

核心程式碼,其它的程式碼是佈局有兩個按鈕和一個文字,並且新增點選事件,這裡不貼程式碼了。

 @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_create_apple:
                //對使用者來說,遮蔽了具體的細節,我管你雜榨汁呢
                IJuice appleJuice = JuiceFactory.createJuice("apple") ;
                tv_show_result.setText(appleJuice.getName());
                break ;
            case R.id.btn_create_orange:
                IJuice orangeJuice = JuiceFactory.createJuice("orange") ;
                tv_show_result.setText(orangeJuice.getName());

                break ;
            default:
                break ;
        }

    }
}複製程式碼
  • 5、執行結果看果

試試榨汁機
試試榨汁機

這樣我們一個簡單的工廠模式就完了,是不是很簡單「所以才叫簡單工廠模式嗎 (*^__^*)」

三、從 Android 中看簡單工廠

BitmapFactory

在 Android 中我們經常使用 Bitmap ,其實和 Bitmap 相關的 BitmapFactory 就是一個簡單工廠模式

我們來看看 BitmapFactory 的方法

BitmapFactory_method.png
BitmapFactory_method.png

可以看到 BitmapFactory 分為兩類,一類是普通原靜態方法「紅色框中」,第二類是 JNI 呼叫的方法「黃色框內」

其實從字面意思我們也可以看到 BitmapFactory 就是 Bitmap 的工廠就是用來生成 Bitmap 的

概括起來 BitmapFactory 生成 Bitmap 無非就是根據三種輸入源「各個引數」

  • 1、圖片的路徑
  • 2、圖片的二進位制檔案
  • 3、圖片的流

好我們現在就拿簡單工廠模式來分析 BitmapFactory ,為什麼說 BitmapFactory 是一個簡單工廠模式

BitmapFactory UML 分析

通過前面的學習,我們知道簡單工廠模式要有一個產品「抽象類」,具體產品「實現類」,還要有一個工廠,我們拿這三樣對比 BitmapFactory 就可以了 ,我們看到是這樣的

BitmapFactory 的簡易 UML
BitmapFactory 的簡易 UML

納尼?這是簡單工廠模式嗎?怎麼和簡單工廠模式的結構匹配不上呢,話說我的產品介面呢?

這肯定是簡單工廠模式,沒看比我們前面的簡單工廠模式結構還簡單嗎?*^__^*,還有誰 TM 說一定必須得有抽象產品這麼一說「反正我沒有說」,為什麼呢?因為 BitmapFactory 很明確就是建立 bitmap 的「功能很單一」,這裡的 bitmap 就是我的具體產品「只有這一個產品呀,你咬我呀」,我還需要抽象產品介面嗎?肯定不需要了。

BitmapFactory 生成 Bitmap 流程

大概看一個 BitmapFactory 生成 Bitmap 的一個流程吧,這裡以 decodeFile(String filePath) 為例來說明

bitmapfactory_decodefile.png
bitmapfactory_decodefile.png

上圖已經很清楚的看到使用 BitmapFactory.decodeFile(String filePath) 生成一張 Bitmap 的過程了「最後是呼叫 JNI 來生成 Bitmap 的」,其它的方法過程都是類似,其實這一張圖就是生成一張 Bitmap 的細節,而使用 BitmapFactory 就是把這些細節都遮蔽了,我管你雜生成的,我給你一個圖片路徑你給我生成一個 Bitmap 就好了

2、Executors 「它不是 Android 固有,Java 中就有」

我們對 Executors 應該不會陌生「這裡不過多講 Executors,只是感受一下簡單工廠模式」,Executors 是用來建立執行緒池的,其它它也是一個工廠,我們來看看吧

我們來看看 Executors 的方法

Executors 的部分方法
Executors 的部分方法

在這裡,我只擷取了部分方法,我們可以看到 Executors 有一些建立快取執行緒池等等一系列方法,並且其中還有一個執行緒工廠「圖中紅色框,從名字可以看出」

Executors 簡單的 UML

Executors 簡單的 UML
Executors 簡單的 UML

上圖是 Executors 簡單的一個 UML 沒有全部畫出,大概意思基本上表明瞭,我們從圖中可以看出,Executors 完全就是一個簡單工廠模式,基本上符合我們簡單工廠模式的結構,只不過多了幾個介面和類而已「我們只看(1),(2),(3) 就完全符合簡單工廠模式」,也就是我給你一些引數你給我建立我想要的執行緒池即可

四、簡單工廠的優缺點

優點:

  • 實現起來非常簡單「不然叫毛個簡單工廠呢」,也充分利用了多型機制
  • 解耦「使呼叫端不再建立物件,而是交給工廠去建立」,並且對內部實現遮蔽「呼叫端不知道具體實現」
  • 分工明確,並且能更好的體現出程式碼含義

缺點:

  • 工廠靜態方法無法繼承
  • 程式碼維護不容易,如果想要建立更多的具體實現的物件,需要大量修改工廠
  • 違反開閉原則「對擴充套件開放,對修改關閉」,如果有一個新的物件要新增,那麼就要修改工廠

以上就是對簡單工廠模式的一個介紹,確實挺簡單的

相關文章