定義乙個用於建立物件的介面,讓子類決定例項化哪個類。工廠方法是乙個類的例項化延遲到子類。
工廠方法可以解耦,降低**的重複性。
簡單工廠:靜態工廠方法,乙個模組僅需要乙個工廠類, 沒有必要把它產生出來。
工廠方法:多個工廠
**: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,我...