設計模式(二) 工廠模式

2021-09-24 10:25:48 字數 2721 閱讀 2234

​ 定義乙個用於建立物件的介面,讓子類決定例項化哪個類。工廠方法是乙個類的例項化延遲到子類。

工廠方法可以解耦,降低**的重複性。

簡單工廠:靜態工廠方法,乙個模組僅需要乙個工廠類, 沒有必要把它產生出來。

工廠方法:多個工廠

**:github

乙個模組僅需要乙個工廠類, 沒有必要把它產生出來, 使用靜態的方法就可以了。在需要建立物件較少,呼叫者也比較簡單時候使用。

缺點是工廠類的擴充套件比 較困難, 不符合開閉原則(可以通過反射方法建立例項)

定義乙個動物類:

public

class

animal

}

定義乙個貓類繼承動物類:

public

class

catextends

animal

}

定義乙個狗繼承動物類:

public

class

dogextends

animal

}

建立乙個動物工廠:

public

class

animalfactory

catch

(classnotfoundexception e)

catch

(instantiationexception e)

catch

(illegalacces***ception e)

return obj;

}}

工廠類通過反射方法建立例項。

不再提供乙個統一的工廠類來建立所有的物件,而是針對不同的物件提供不同的工廠。也就是說每個物件都有乙個與之對應的工廠 。

優點:

缺點:

定義乙個動物的抽象類:

public

abstract

class

abstractanimal

乙個生產動物的工廠:

public

inte***ce

animalfactory

貓和狗的工廠:

public

class

catfactory

implements

animalfactory

}public

class

dogfactory

implements

animalfactory

}

有多個業務型別和分類時候,可以用抽象工廠模式生產需要的物件。

抽象工廠和工廠方法的區別:

抽象工廠是生產對產品有結構劃分的產品,工廠方法只生成單一產品。以貓和狗為例,現在要區分公母。也就是說有公貓和母貓,以及公狗和母狗。每個產品多了一層約束。

優點:

缺點:1、代替單例模式,可以用簡單工廠方法通過反射建立單例。該框架可以繼續擴充套件, 在乙個專案中可以 產生乙個單例構造器, 所有需要產生單例的類都遵循一定的規則(構造方法是private) , 然 後通過擴充套件該框架, 只要輸入乙個型別就可以獲得唯一的乙個例項。

public

class

singleton

public

void

dosomething()

}

通過簡單工廠方法建立單例

public

class

singletonfactory

catch

(exception e)

}public

static singleton getsingleton()

}

2、延遲初始化:乙個物件被消費完畢後, 並不立刻釋放, 工廠類 保持其初始狀態, 等待再次被使用。 延遲初始化是工廠方法模式的乙個擴充套件應用。

public

class

productfactory

else

else

//同時把物件放到快取容器中

prmap.

put(type,product);}

return product;

}}

​ 延遲載入框架是可以擴充套件的, 例如限制某乙個產品類的最大例項化數量, 可以通過判斷 map中已有的物件數量來實現, 這樣的處理是非常有意義的, 例如jdbc連線資料庫, 都會 要求設定乙個maxconnections最大連線數量, 該數量就是記憶體中最大例項化的數量。

​ 延遲載入還可以用在物件初始化比較複雜的情況下, 例如硬體訪問, 涉及多方面的交 互, 則可以通過延遲載入降低物件的產生和銷毀帶來的複雜性。

​ 工廠方法模式是new乙個物件的替代品, 所以在所有需要生成物件的地方都可以使用, 但是需要慎重地考慮是否要增加乙個工廠類進行管理, 增加**的複雜度。

​ 需要靈活的、 可擴充套件的框架時, 可以考慮採用工廠方法模式。 萬物皆物件, 那萬物也就皆產品類, 例如需要設計乙個連線郵件伺服器的框架, 有三種網路協議可供選擇: pop3、 imap、 http, 我們就可以把這三種連線方法作為產品類, 定義乙個介面如 iconnectmail, 然後定義對郵件的操作方法, 用不同的方法實現三個具體的產品類(也就是 連線方式) 再定義乙個工廠方法, 按照不同的傳入條件, 選擇不同的連線方式。

二 設計模式 工廠模式

一.傳統時以pizza類舉例,乙個抽象類pizza,由幾個pizza實現類實現,主餐廳看看客戶點什麼便生產,但是如果需要增加新的pizza品種,則要增加乙個新的實現類,然後主餐廳裡增加對邏輯的判斷,顯然,違背了開放關閉原則。所以 工廠模式為解決某些需要生產大量一批類的問題 二.簡單工廠模式 定義了乙...

設計模式(二)工廠模式

與 模式不同,生產模式隱藏過程,只關注結果 簡單工廠,工廠方法,抽象工廠 一,簡單工廠模式 public inte ce car public class aodi implements car public class baoma implements car public class facto...

設計模式(二) 工廠模式

前言 我在面試的時候,有時候會問到候選人有沒有熟悉的設計模式,一般大部分候選人會選擇說熟悉單例和工廠 也有部分人會說熟悉觀察者 如果我進一步問候選人是如何應用工廠模式的,10個候選人有10個會舉連線sqlserver,oracle,mysql等不同資料庫時會用工廠模式產生不同的連線的例子。omg,我...