工廠模式:主要用來例項化有共同介面的類,工廠模式可以動態決定應該例項化那乙個類。
工廠模式的形態
工廠模式主要用一下幾種形態:
1:簡單工廠(。
2:工廠方法
3:抽象工廠
簡單工廠
又叫靜態工廠
,是工廠模式三中狀態中結構最為簡單的。主要有乙個靜態方法,用來接受引數,並根據引數來決定返回實現同一介面的不同類的例項。我們來看乙個具體的例子:
假設一家工廠,幾生產洗衣機,有生產冰箱,還有空調等等..
我們先為所有產品定義乙個共同的產品介面
public
inte***ce
product{}
接著我們讓這個工廠的所有產品都必須實現此介面
public
class
washer
implements
product
} public
class
icebox
implements
product
} public
class
aircondition
implements
product }
接下來我們來寫乙個工廠類,有它來負責生產以上的產品
public
class
******factory else
if(productname.equals(
"icebox"
))else
if(productname.equals(
"aircondition"
))else }
} 好了,有了這個工廠類,我們就可以開始下定單了,
******factory
將根據不同的定單類決定生產什麼產品。
public
static
void
main(string args) catch
(exception e) }
由上面的**可以看出,簡單工廠的核心就是乙個
******factory
類,他擁有必要的邏輯判斷能力和所有產品的建立權利,我們只需要向把定單給他,就能得到我們想要的產品。這使用起來似乎非常方便。
但,實際上,這個
******factory
有很多的侷限。首先,我們每次想要增加一種新產品的時候,都必須修改
******factory
的原**。其次,當我們擁有很多很多產品的時候,而且產品之間又存在複雜的層次關係的時候,這個類必須擁有複雜的邏輯判斷能力,其**量也將不斷地激增,這對以後的維護簡直就是恐怖兩個字...
還有就是,整個系統都嚴重依賴
******factory
類,只要
******factory
類一出問題,系統就進入不能工作的狀態,這也是最為致命的一點....
以上的不足將在工廠模式的另外兩種狀態中得到解決。
工廠方法
上面的**告訴我們,
簡單工廠
並不簡單,它是整個模式的核心,一旦他出了問題,整個模式都將受影響而不能工作,為了降低風險和為日後的維護、擴充套件做準備,我們需要對它進行重構,引入
工廠方法
。工廠方法為工廠類定義了介面,用多型來削弱了工廠類的職能,以下是工廠介面的定義:
public
inte***ce
factory
我們再來定義乙個產品介面
public
inte***ce
product{}
一下是實現了產品介面的產品類
public
class
washer
implements
product
} public
class
icebox
implements
product
} public
class
aircondition
implements
product }
接下來,就是工廠方法的核心部分,也就是具體建立產品物件的具體工廠類,
//建立洗衣機的工廠
public
class
createwasher
implements
factory
} //建立冰箱的工廠
public
class
createicebox
implements
factory
} //建立空調的工廠
public
class
createaircondition
implements
factory }
從上面建立產品物件的**可以看出,
工廠方法
和簡單工廠
的主要區別是,
簡單工廠
是把建立產品的職能都放在乙個類裡面,而
工廠方法
則把不同的產品放在實現了工廠介面的不同工廠類裡面,這樣就算其中乙個工廠類出了問題,其他工廠類也能正常工作,互相不受影響,以後增加新產品,也只需要新增乙個實現工廠介面工廠類,就能達到,不用修改已有的**。但
工廠方法
也有他侷限的地方,那就是當面對的產品有複雜的等級結構的時候,例如,工廠除了生產家電外產品,還生產手機產品,這樣一來家電是手機就是兩大產品家族了,這兩大家族下面包含了數量眾多的產品,每個產品又有多個型號,這樣就形成了乙個複雜的產品樹了。如果用
工廠方法
來設計這個產品家族系統,就必須為每個型號的產品建立乙個對應的工廠類,當有數百種甚至上千種產品的時候,也必須要有對應的上百成千個工廠類,這就出現了傳說的類**,對於以後的維護來說,簡直就是一場災難.....
抽象工廠
抽象工廠
:意的意圖在於建立一系列互相關聯或互相依賴的物件。<
我自己覺得
抽象工廠
是在工廠方法
的基礎上引進了分類管理的概念....
工廠方法用來建立乙個產品,它沒有分類的概念,而抽象工廠則用於建立一系列產品,所以產品分類成了抽象工廠的重點,
我們繼續用上面的例子來說明:
工廠生產的所有產品都用都用大寫字母來標明它們的型號,比如冰箱,就有「冰箱-a",「冰箱-b",同樣,其他的產品也都是遵守這個編號規則,於是就有了一下產品家族樹
冰箱:冰箱-a
冰箱-b
洗衣機:
洗衣機-a
洗衣機-b
我們可以為冰箱和洗衣機分別定義兩個產品介面,以對他們進行分類,
//洗衣機介面
public
inte***ce
washer
//冰箱介面
public
inte***ce
icebox
接著,我們分別建立這兩個介面的具體產品
//洗衣機-a
public
class
washera
implements
washer
} //洗衣機-b
public
class
washerb
implements
washer
} //冰箱-a
public
class
iceboxa
implements
icebox
} //冰箱-b
public
class
iceboxb
implements
icebox }
到此,產品部分我們準備好了,接下來我們來處理工廠部分,我們先來定義工廠行為介面
public
inte***ce
factory
接下來我創造具體的工廠類,我們根據上面產品的介面,把型號a的產品分為一類,由乙個工廠來管理,把型號為b的產品有另乙個工廠管理,根據這個分類,我們可以實現如下的兩個具體工廠類
//建立型號為a的產品工廠
public
class
factorya
implements
factory
//建立冰箱-a
public
icebox createicebox()
} //建立型號為b的產品工廠
public
class
factoryb
implements
factory
//建立冰箱-b
public
icebox createicebox() }
這樣,我們的抽象工廠就完成了。有上面可以看出,在運用上我覺得工廠方法和抽象工廠,都有自己的應用場景,並沒有什麼優劣之分,但在應用抽象工廠之前,要先對建立的物件進行系統的分類,這點很重要,好的產品分類規則能為具體工廠類的選擇呼叫和以後的擴充套件提供清晰的思路.
Java三種工廠設計模式
乙個栗子 我喜歡吃麵條,抽象 乙個麵條基類 介面也可以 這是產品的抽象類。public abstract class inoodles 程式設計師加班必備也要吃泡麵 具體的產品類 public class paonoodles extends inoodles還有我最愛吃的家鄉的幹扣面 具體的產品類...
java設計模式 三種工廠模式
工廠模式提供建立物件的介面。工廠模式分為三類 簡單工廠模式 factory 工廠方法模式 factory method 和抽象工廠模式 abstract factory gof在 設計模式 中將工廠模式分為兩類 工廠方法模式 factory method 和抽象工廠模式 abstract facto...
Java三種設計模式
私有功能 private animalfactory 工廠改進 提供貓和狗這兩種動物 public static animal createanimal string type else if cat equals type else 2,工廠方法模式 需要提供抽象類,具體的類,乙個工廠介面,以及具...