人人都會設計模式之:簡單工廠模式--SimpleFactory

simply_factory.png

版權聲明:本文爲博主原創文章,未經博主容許不得轉載java

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

教程簡介緩存

  • 一、閱讀對象
    本篇教程適合新手閱讀,老手直接略過
  • 二、教程難度
    初級
  • 三、Demo 地址
    稍後 提供

正文app

1、什麼是簡單工廠

一、 生活中的工廠

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

工廠就是一個製造廠,在生活中工廠太多太多了,好比車廠就是用來造車的,雙匯就是出火腿腸的「固然不僅是火腿」,菸草廠就是製做和加工香菸的,等等。佈局

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

二、 程序中的工廠

程序是源於生活的,因此程序中的工廠和生活中的工廠很是相似,生活工廠中的產品很是多,可是在程序中工廠的做用就是創造對象。ui

簡單工廠模式定義spa

簡單工廠模式又稱爲靜態工廠模式,簡單工廠模式的做用就是建立一個工廠類用來建立其它類的實例,至於類是怎麼樣建立的對用戶來講是不可見的「屏蔽細節」線程

簡單工廠模式結構

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

簡單工廠模式的 UML 圖

簡單工廠 UML

2、簡單工廠舉例

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

分析一下:

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

寫代碼

寫代碼以前先看看榨汁機工廠的 UML 圖

榨汁機工廠

  • 一、定義抽象產品果汁接口 IJuice.java
/**
 * @Description 建立一個果汁接口
 * @Creator TigerChain(建立者)
 */
public interface IJuice {
    String getName() ;
    //也能夠聲明一些其它的業務方法
}
  • 二、定義具體的產品,蘋果汁「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 "我是桔子汁";
    }
}
  • 三、建立榨汁機「工廠類」 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 ;
    }
}
  • 四、在 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 ;
        }

    }
}
  • 五、運行結果看果

試試榨汁機

這樣咱們一個簡單的工廠模式就完了,是否是很簡單「因此才叫簡單工廠模式嗎 (*^__^*)」

3、從 Android 中看簡單工廠

BitmapFactory

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

咱們來看看 BitmapFactory 的方法

BitmapFactory_method.png

能夠看到 BitmapFactory 分爲兩類,一類是普通原靜態方法「紅色框中」,第二類是 JNI 調用的方法「黃色框內」

其實從字面意思咱們也能夠看到 BitmapFactory 就是 Bitmap 的工廠就是用來生成 Bitmap 的

歸納起來 BitmapFactory 生成 Bitmap 無非就是根據三種輸入源「各個參數」

  • 一、圖片的路徑
  • 二、圖片的二進制文件
  • 三、圖片的流

好咱們如今就拿簡單工廠模式來分析 BitmapFactory ,爲何說 BitmapFactory 是一個簡單工廠模式

BitmapFactory UML 分析

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

BitmapFactory 的簡易 UML

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

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

BitmapFactory 生成 Bitmap 流程

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

bitmapfactory_decodefile.png

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

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

咱們對 Executors 應該不會陌生「這裏不過多講 Executors,只是感覺一下簡單工廠模式」,Executors 是用來建立線程池的,其它它也是一個工廠,咱們來看看吧

咱們來看看 Executors 的方法

Executors 的部分方法

在這裏,我只截取了部分方法,咱們能夠看到 Executors 有一些建立緩存線程池等等一系列方法,而且其中還有一個線程工廠「圖中紅色框,從名字能夠看出」

Executors 簡單的 UML

Executors 簡單的 UML

上圖是 Executors 簡單的一個 UML 沒有所有畫出,大概意思基本上代表了,咱們從圖中能夠看出,Executors 徹底就是一個簡單工廠模式,基本上符合咱們簡單工廠模式的結構,只不過多了幾個接口和類而已「咱們只看(1),(2),(3) 就徹底符合簡單工廠模式」,也就是我給你一些參數你給我建立我想要的線程池便可

4、簡單工廠的優缺點

優勢:

  • 實現起來很是簡單「否則叫毛個簡單工廠呢」,也充分利用了多態機制
  • 解耦「使調用端再也不建立對象,而是交給工廠去建立」,而且對內部實現屏蔽「調用端不知道具體實現」
  • 分工明確,而且能更好的體現出代碼含義

缺點:

  • 工廠靜態方法沒法繼承
  • 代碼維護不容易,若是想要建立更多的具體實現的對象,須要大量修改工廠
  • 違反開閉原則「對擴展開放,對修改關閉」,若是有一個新的對象要添加,那麼就要修改工廠

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

相關文章
相關標籤/搜索