1. 程式人生 > >使用第三方框架解耦的一種思路—簡單工廠模式的運用

使用第三方框架解耦的一種思路—簡單工廠模式的運用

前言: 能在平時的coding中,使用到設計模式,是一件非常細節的事,但恰恰也是走向高階的開端,同樣一段程式碼,不同的人寫,水平是不一樣的。今天是由gdutxiaoxu投稿本公眾號授權釋出的,gdutxiaoxu之前寫的《記一次360面試》也是在本公眾號獨家釋出的,是老朋友了。gdutxiaoxu的blog:http://blog.csdn.net/gdutxiaoxu/. 看下正文:

寫在前頭,這篇部落格對於老司機們沒什麼多大的意義,老司機們就不用看了,對於新手還是有很大實用價值的。

平時在專案中,你們有沒有遇到這樣的情況,比如之前專案是使用開源框架ImageLoader,現在想使用Picasso或者Glide,這時候你會怎麼辦呢?是一行一行程式碼去改嗎?

當然可以,如果專案使用到ImageLoader相應的方法少的話,那還可以,但是一旦專案比較大型的話,這會是多大的工作量,估計至少得改個幾天,累先不說,至少毫無意義,那怎麼辦呢?別急,下面就來講解。

第一種方法

這種方法大多數人都會使用,直接封裝成為一個工具類,提取公共引數,以後想修改的話,直接修改工具類裡面具體的實現 

  1. publicclassImageLoaderUtils {

  2. publicstaticvoid loadImageView(Context mContext,

  3. String url, ImageView mImageView) {

  4. Picasso.with(mContext).load(url).

    into(mImageView);

  5.    }

  6. }

這個時候我們的專案中如果不想使用Picasso,這個時候我們想使用Glide,我們只需修改 ImageLoaderUtils類中方法的具體實現即可,程式碼如下 

  1. publicclassImageLoaderUtils {

  2. /**

  3.     * 指定大小載入圖片

  4.     *

  5.     * @param mContext   上下文

  6.     * @param url       圖片路徑

  7.     * @param mImageView 控制元件

  8.     */

  9. publicstaticvoid loadImageView(Context mContext,

  10. String url, ImageView mImageView) {

  11. //        Picasso.with(mContext).load(url).into(mImageView);

  12. Glide.with(mContext).load(url).into(mImageView);

  13.    }

  14. }

看了上面的程式碼,相信大多數人都知道,如果我們不封裝,我們必須查詢每個類檔案裡面使用到Picasso的相應方法的位置,然後再替換,這會是一個很大的工作量。而我們如果進行封裝,只需更改工具類裡面的方法的具體實現,這樣是不是很方便呢?看到這裡,你是不是覺得這篇文章結束呢,還沒,下面介紹另外一種方法,這種方法將更加優雅。

那就是使用簡單工廠模式。

簡單工廠模式

定義

簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。簡單點說就是用來建立具有相同基類的物件

類UML圖


角色介紹

從上面的UML圖可以看到,總共有三個角色Factory,Product,ConcreteProuct,其中Factory依賴於Product

Product:產品的基類,通常有抽象類或者介面來充當,用來統一介面,不關心細節的實現

ConcreteProduct:Product的具體實現類

Factory:工廠類,用來建立物件,可以根據引數的不同返回不同的Product物件,實現邏輯封裝在其內部

使用步驟

從上面的分析,我們知道,採用簡單工廠模式,一般需要三個步驟

  • 抽象Product的共同特點,定義成一個介面或者抽象類

  • ConcreteProduct的具體實現

  • 實現Factory

下面我們一起來看一下怎樣運用於替換圖片框架上

簡單工廠模式的運用——幾行程式碼更換圖片框架

首先為了加深理解,我們一起先來看一下類UML圖


接著按照上面的三部曲,第一步,我們先定義一個介面IimageListener,用來統一引數

  1. publicinterfaceIimageListener {

  2. void display(Context context, ImageView imageView,

  3. String url, int progressId, int errorId,

  4. Object tag);

  5. void display(Context context, ImageView imageView,

  6. String url, int progressId, int errorId);

  7. void display(Context context, ImageView imageView,

  8. String url, int progressId);

  9. void display(Context context, ImageView imageView,

  10. String url);

  11. void display(Context context, ImageView imageView, Uri uri);

  12. }

第二步,我們來寫GlideRequest和PicassoRequest的具體實現

  1. publicclassGlideRequestimplementsIimageListener {

  2. @Override

  3. publicvoid display(Context context, ImageView imageView,

  4. String url, int progressId, int

  5.            errorId, Object tag) {

  6. DrawableTypeRequest<String> load =

  7. Glide.with(context).load(url);

  8. if (progressId != -1) {

  9.            load.placeholder(progressId).centerCrop();

  10.        } else {

  11.            load.placeholder(newColorDrawable(Color.GRAY));

  12.        }

  13. if (errorId != -1) {

  14.            load.error(errorId);

  15.        }else{

  16.            load.error(R.drawable.ic_error);

  17.        }

  18.        load.into(imageView);

  19. 相關推薦

    使用第三方框架思路簡單工廠模式運用

    前言: 能在平時的coding中,使用到設計模式,是一件非常細節的事,但恰恰也是走向高階的開端,同樣一段程式碼,不同的人寫,水平是不一樣的。今天是由gdutxiaoxu投稿本公眾號授權釋出的,gdutxiaoxu之前寫的《記一次360面試》也是在本公眾號獨家釋出的,是老朋友了。gdutxiao

    Java 設計模式):簡單工廠模式

    參考連結:簡單工廠模式-Simple Factory Pattern 1. 模式概述 定義:定義一個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用於建立例項的方法是靜態方法,因此簡單工廠模式又被稱為靜態工廠方法模式。 簡

    設計模式)從“簡單工廠模式”升級為“工廠方法模式

    工廠模式的引入是為了管理物件的構造,對使用者遮蔽構造過程,使用者只從工廠拿取新物件。 簡單工廠模式 用一個場景介紹簡單工廠模式:某工廠想包攬所有產品生產,不僅提供很多不同型別的產品(iPhone 5,6,7...),還時不時生產新型別的產品(三星S8),而且客戶不關係產品

    【C++設計模式】C++簡單工廠模式

    #(1)定義 定義一個簡單工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。 #(2)結構 簡單工廠模式有以下的結構: * 工廠(Factory):根據客戶提供的具體產品類的引數,建立具體產品例項; * 抽象產品(AbstractProduct):具體產品類的基類,包含建立產

    Java改變異常輸出的形式,封裝框架的時候覺得有用,自定義異常輸出的思路

    Java的異常輸出,有時輸出一大堆內容,針對異常的輸出格式,目前有像Log4J等框框,通過在類路徑下配置一個log4j.properties,新增相關的jar包即可。 以下是在看開源框架GUNS裡的工具類原始碼時所啟發,其實我們也可以自己定義自己的輸出格式,以

    大氣簡單的Web管理(陳列)版面設計

    borde absolut setup hid color 正常的 for pre == 在頁面的設計中,多版面是一種常見的設計樣式。本文命名一種 這種樣式。能夠簡單描寫敘述為一行top,一列左文件夾,剩余的右下的空間為內容展示區。這種樣式,便於高速定位

    加速 Unity 不同平臺打包的思路

    安裝 轉化 定期 進行 unity 單獨 創建文件 不同 提高 Unity打包總的來說還不是一件特別復雜的事情, 但是我們知道任何關於跨平臺(多線程等)這類問題, 總是會把事情搞得復雜起來. 以前項目的打包是通過Jenkins對一個工程下對不同平臺多次打包, 不可避免需要切

    思路比較2個日期是否相等的方式

    字符 進行 != 思路 ati 轉換 格式轉換 new imp 我們在應用中經常會遇到2個日期比較是否同一年,或者同一個月或者同一日,等。 常規方式,我們通過逐個年,月,日的比較,才能確定是否是同一年,或同一個月或同一日。 我們換一種思路,把2個日期按同一個日期格式轉換成字

    Python Selenium 獲取不到彈出框的另外思路

    定位 smi 但是 element button 圖片 color 遇到 dism 大家都知道彈出框大致可以分為三種:1.警告消息框(alert)、2.確認消息框(confirm)、3.提示消息對話(prompt) 而selenium 提供switch_to_alert()

    layerUi與AJAX的思路

    失敗 val 取消 nbsp asc 操作 HR lse ror javascript:function rep(id) { layer.confirm("確定要拒絕此認證嗎?", { btn: ["確定", "取消"] }, functi

    使用貝塞爾曲線進行插值 非常簡單的平滑多邊形的方法

    ear loop line coin algorithm tro itl art mov 原文 Interpolation with Bezier Curves A very simple method of smoothing polygons Init

    Flash存取資料的另思路

    在嵌入式專案中,為了讓裝置在斷電後某些關鍵引數不丟失,比如裝置ID,網路配置,外設配置等。我們會將這些關鍵的引數儲存到片內的Flash中。一般的做法都是在Flash劃分一塊空間做儲存引數用,並且裡面有一個空間儲存一個標誌,這個標誌指示了Flash中是否儲存了有效的引數。在第一次燒錄程式時,Flash

    Google瀏覽器URL採集的思路

    很多寫的Google採集經常被谷歌幹掉,利用js指令碼收集不失為一種比較好的方法 比如我們利用語法收集敏感資訊: site:xxxx.com ext:doc | ext:docx | ext:odt | ext:pdf | ext:rtf | ext:sxw | ext

    她從城市回到農村創業,後來有自己的林地,只是換了思路

    下崗後不服輸的麼學紅,不甘心閒在家中無所事事,決心靠創業改變命運。她做過服裝生意,還擺過攤賣過菜……但是幾年闖下來,她始終也沒有找到一條成功的道路。 麼學紅想,樹挪死,人挪活,我就不信沒有自己的路!換一種思路,就是換一種活法。城市無路可走,去農村搞種養,也許是一種出路。於是,2001年,她

    python 利用 xdrlib 操作追加excel思路

    今天在做一個專案,需要用到將網頁上爬取的資料整理出來並存入excel檔案中,剛開始使用的是xlwt控制元件來做,但是發現每次迴圈寫入excel後,檔案原來的內容都會被覆蓋,後來網上搜集資料 使用  xdrlib 來做,但xdrlib 只能追加一次,它是利用一種複製檔案的思路

    優化JS載入時間過長的思路

    1.背景 去年公司在漳州的一個專案中,現場工程人員反映地圖部分出圖有點緩慢,大約需要20多秒。和另外一個同事一起花了一兩天進行了程式碼優化、程式碼壓縮、中介軟體優化以及服務部署優化後使地圖出圖縮短到了9秒上下。 這裡對上次的經驗做一個總結,提供一種優化JS檔案載入時間

    簡單工廠模式工廠模式中最簡單

    場景:要實現不同型別的彈窗,警示框、提示框、確認框。這些彈框存在一些相似的地方,也存在一些不同的地方。可以將不同的屬性作為引數傳遞進來。 function creatPop(type,text){ // 建立一個物件,並對物件拓展屬性和方法 var o = new Object();

    關於處理if和複雜邏輯的思路及…

     折騰了好久的qbs的解決方案今天終於有眉目了,這個設計思路還是很巧妙的,對於處理多路if else等有非常好的效果,提高了程式碼的靈活性和設計的可重用性,程式碼更加簡潔,邏輯更加清晰,真的得好好的研究一番,明天開始正式把程式碼敲出來,慢慢的就會成為自己的東西,真正的

    SpringMVC同時支援多檢視(JSP,Velocity,Freemarker等)的思路實現

    第一種方式: 在基於SpringMVC的專案中有時需要同時使用多種檢視格式,如jsp,velocity及freemarker等,通過不同的請求路徑配置規則,對映到不同的檢視檔案。下面我提供一種思路,通過檢視模板檔案字尾名的方式來進行處理。例如: @RequestMap

    漢諾塔問題原始碼詳比較形象的輸出顯示結果

    // Hanoi.cpp : Defines the entry point for the console application. // #include <stdafx.h> #include "stdio.h" #include "iostream.h