每天乙個設計模式之Factory

2021-06-16 05:33:41 字數 1273 閱讀 5261

這點是使用工廠模式的主要目的。當client需要乙個類的例項時,它並不需要自己去例項化那個類,而是交給工廠去例項化。這樣client就不需要知道這個類是怎麼例項化的了。

這樣物件的使用者和物件本身就解耦合了。

如何實現

需要注意的是,客戶端既不知道,也不關心被例項化的類是什麼,而只是得到了乙個抽象類。而工廠類本身常常是乙個singleton的類,即工廠類不允許被例項化,而是提供靜態方法。

最簡單的工廠

public class productfactory

...}

上例的問題是,每次新增乙個新product的時候就需要修改工廠類。為了解決這個問題,工廠需要做一下改變。

更靈活的工廠類

class productfactory

public product createproduct(string productid)

);//其實這裡已經使用了反射。首先使用反射得到了這個類的建構函式。然後使用建構函式例項化這個物件並返回。

return (product)productconstructor.newinstance(new object );

}}

上例的解決方法是,提供乙個註冊產品的方法。每個註冊過的產品都會被放到map中,且儲存productid和product class type。只要是註冊過的產品,工廠類就可以例項化該產品。

但是又乙個問題:我們必須在呼叫工廠前完成所有product的註冊。如果註冊product的**在呼叫工廠之後,則會找不到想例項化的類。

這裡繼續使用反射可以解決問題,大家參考原文吧。

不過我覺得就用noob factory挺好的。後面的方法雖然靈活,但是邏輯過於分散。把class creation都放在factory class裡改起來簡單。

如果不想使用反射,我們需要的是讓每個類自己解決註冊的問題,而不是在工廠裡註冊:

abstract class product 

class oneproduct extends product

public oneproduct createproduct()

}class productfactory

public product createproduct(string productid)

}

每天乙個設計模式之單例模式

單例模式 確保某個類只有乙個例項,並且只能自行例項化並且向系統提供這個示例。單例模式有幾個特點 單例模式在很多場景都可以使用到,比如執行緒池 快取 日誌物件 印表機或者顯示卡驅動的物件等等,這些場景下,如果有多個例項的話,可能會導致程式的行為異常 資源使用過量等問題的出現。因此,學習單例模式是很有必...

每天乙個設計模式之觀察者模式

觀察者模式也叫做 發布 訂閱模式 它是一種在專案中常用的模式。定義 定義物件間一種一對多的依賴關係,使得每當乙個物件改變狀態,則所有依賴於它的物件都會得到通知並被自動更新。觀察者模式的類圖如下 其實通俗一點講,觀察者模式就類似於我們生活中的訂報紙。如果我們向報社訂了報紙,你每天都會收到報社送過來的新...

每天乙個設計模式(一) 簡單工廠模式

建立型模式中的工廠系列,有 簡單工廠模式 工廠方法模式 抽象工廠模式。簡單工廠模式實現了這樣乙個功能 當你需要什麼,只需要傳入乙個正確的引數,就可以獲取你所需要的物件,而無須知道其建立細節。假設這樣乙個場景 乙個畫圖系統想要畫出不同圖形 如圓形 矩形 三角形等 這些圖形類都源自同乙個基類。如果我們希...