上篇文章我們討論了設計模式在軟體開發中的重要性,今天我們就來做個實際的例子展示一下設計模式的魅力。在日常開發中經常會遇到某種實現的不同選擇問題,如上傳可能分:阿里雲上傳和私有雲上傳,客戶端的展示也可能分:fresco和glide。當然我們可以切換的時候來進行大量的修改來達到目的,但其實有更優雅的方法來實現相容多種具體實現的方案。
我們就拿上傳舉例,比如最開始的時候沒考慮太多就直接使用了阿里雲作為儲存的地方,那麼你可能會寫出下面的**。
public
class
aliyunimagestore
public string uploadtoaliyun
(image image, string bucketname, string accesstoken)
public image downloadfromaliyun
(string url, string accesstoken)
// aliyunimagestore 類的使用舉例 public class imageprocessingjob
}
整個上傳流程包含三個步驟:建立 bucket(你可以簡單理解為儲存目錄)、生成 access token 訪問憑證、攜帶 access token 上傳到指定的 bucket 中。**實現非常簡單, 類中的幾個方法定義得都很乾淨,用起來也很清晰,乍看起來沒有太大問題,完全能滿足我 們將儲存在阿里雲的業務需求。
不過,軟體開發中唯一不變的就是變化。過了一段時間後,我們自建了私有雲,不再將 儲存到阿里雲了,而是將儲存到自建私有雲上。為了滿足這樣乙個需求的變化,解決這個問題的根本方法就是,在編寫**的時候,要遵 從「基於介面而非實現程式設計」的原則,我們可能會這麼改:
public
inte***ce
imagestore
public
class
aliyunimagestore
implements
imagestore
public image download
(string url)
private
void
createbucketifnotexisting
(string bucketname)
private string generateaccesstoken()
}public
class
privateimagestore
implements
imagestore
public image download
(string url)
private
void
createbucketifnotexisting
(string bucketname)
}// imagestore 的使用舉例
public
class
imageprocessingjob
我們通過介面來隔離了兩個具體的實現。但如果我們還要替換儲存方式,還是需要修改很多類似介面 = new 具體類;那樣的**。這樣的設計還是不夠完美,因此我們可以嘗試使用工廠模式 + 配置檔案的方式去做,**如下。
public
inte***ce
imagestore
public
class
aliyunimagestore
implements
imagestore
@override
public string upload
(image image, string bucketname)
@override
public image download
(string url)
private
void
createbucketinfnotexisting
(string bucketname)
private string generateaccesstoken()
}public
class
privateimagestore
implements
imagestore
@override
public string upload
(image image, string bucketname)
@override
public image download
(string url)
public
void
createbucketinfnotexisting
(string bucketname)
}//工廠類
public
class
imagestorefactory
public
static imagestore newinstance
(string storetype)}}
public
class
imageprocessingjob
public
static
void
main
(string[
] args)
} 配置檔案
store_type=
private
是不是發現**優雅了很多,其實工廠類也可以用反射的方式去實現,**如下:
public
class
imageprocessingjob
catch
(exception e)
}public
static
void
main
(string[
] args)
} 配置檔案
store_class=privateimagestore
設計模式 工廠模式(簡單工廠模式和方法工廠模式)
一 簡單工廠模式 簡單工廠模式概述 又叫靜態工廠方法模式,它定義乙個具體的工廠類負責建立一些類的例項 優點 客戶端不需要在負責物件的建立,從而明確了各個類的職責 缺點 這個靜態工廠類負責所有物件的建立,如果有新的物件增加,或者某些物件的建立方式不同,就需要不斷的修改工廠類,不利於後期的維護 動物類 ...
介面與工廠(設計模式)
介面是實現多重繼承的途徑,而生成遵循某個介面物件的經典方式就是工廠方法設計模式。這種方式與直接呼叫建構函式的不同,我們在工廠物件呼叫的是建立方法,該工廠的方法將生成介面的某個實現類的物件。理論上,通過這種方式,我們的 將完全與介面的實現分離,這就使得我們可以透明地將某個實現替換為另乙個實現。下面我們...
設計模式之簡單工廠 工廠方法模式 抽象工廠模式
這裡講三種模式放在一起說明,是因為三種模式關聯性很強 抽象工廠模式簡單化以後就是工廠方法模式,工廠方法模式再簡單化就是簡單工廠模式 簡單工廠模式並沒有被列入到gof的設計模式中 public class factory 簡單工廠類,實現建立產品物件 class factory return prod...