設計模式 讓你徹底搞懂介面 工廠模式 反射

2021-10-06 18:39:44 字數 2988 閱讀 4111

上篇文章我們討論了設計模式在軟體開發中的重要性,今天我們就來做個實際的例子展示一下設計模式的魅力。在日常開發中經常會遇到某種實現的不同選擇問題,如上傳可能分:阿里雲上傳和私有雲上傳,客戶端的展示也可能分: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...