1、為什麼要使用工廠模式?
2、工廠模式分類(3類):在物件導向程式設計中, 最通常的方法是乙個new操作符產生乙個物件例項,new操作符就是用來構造物件例項的。
但是在一些情況下, new操作符直接生成物件會帶來一些問題。
許多態別物件的創造需要一系列的步驟:
你可能需要計算或取得物件的初始設定;
選擇生成哪個子物件例項;
或在生成你需要的物件之前必須先生成一些輔助功能的物件。
在這些情況,新物件的建立就是乙個 「過程」。
解決方案:建立乙個工廠來建立物件
3、簡單工廠模式:a.簡單工廠模式(****** factory)
b.工廠方法模式(factory method)
c.抽象工廠模式(abstract factory)
這三種模式從上到下逐步抽象,並且更具一般性。
有的將工廠模式分為兩類:工廠方法模式(factory method)與抽象工廠模式(abstract factory)。
將簡單工廠模式(****** factory)看為工廠方法模式的一種特例,兩者歸為一類。
又叫靜態工廠,是工廠模式三中狀態中結構最為簡單的。主要有乙個靜態方法,用來接受引數,並根據引數來決定返回實現同一介面的不同類的例項。
這個模式本身很簡單而且使用在業務較簡單的情況下。一般用於小專案或者具體產品很少擴充套件的情況(這樣工廠類才不用經常更改)。
a.我們先為所有產品定義乙個共同的產品介面.
public inte***ce product{}
b.讓這個工廠的所有產品都必須實現此介面
public
class
washer
implements
product
} public
class
icebox
implements
product
}
c.寫乙個工廠類,有它來負責生產以上的產品
public
class ******factory else
if(productname.equals("icebox"))else
} }
d.使用
public
static
void
main(string args) catch (exception e)
}
4、工廠方法模式:總結:
簡單工廠的核心就是乙個******factory類, 看起來使用很方便。
缺點:1.我們傳遞文字引數的時候很可能書寫錯誤。
2.我們每次想要增加一種新產品的時候,都必須修改******factory的原**。
3.當我們擁有很多很多產品的時候,而且產品之間又存在複雜的層次關係的時候,這個類必須擁有複雜的邏輯判斷能力,其**量也將不斷地激增。
4.整個系統都嚴重依賴******factory類,只要******factory類一出問題,系統就進入不能工作的狀態。(最致命)
以上的不足將在工廠模式的另外兩種狀態中得到解決。
為了降低風險和為日後的維護、擴充套件做準備,我們需要對它進行重構,引入工廠方法。
工廠方法為工廠類定義了介面,用多型來削弱了工廠類的職能。
a.我們先給工廠定義乙個介面
public
inte***ce factory
b.再為所有產品定義乙個共同的產品介面.
public
inte***ce product{}
c.讓這個工廠的所有產品都必須實現此產品介面
public
class
washer
implements
product
} public
class
icebox
implements
product
}
d.接下來,就是工廠方法的核心部分,也就是具體建立產品物件的具體工廠類
//建立洗衣機的工廠
public
class
createwasher
implements
factory
} //建立冰箱的工廠
public
class
createicebox
implements
factory
}
e.使用
public
static
void
main(string args) catch (exception e)
}
5、抽象工廠模式:注意:
工廠方法和簡單工廠的主要區別是,簡單工廠是把建立產品的職能都放在乙個類裡面,而工廠方法則把不同的產品放在實現了工廠介面的不同工廠類裡面。
相比簡單工廠模式優點:
1.這樣就算其中乙個工廠類出了問題,其他工廠類也能正常工作,互相不受影響。
2.以後增加新產品,也只需要新增乙個實現工廠介面工廠類,就能達到,不用修改已有的**。
缺點:工廠方法也有他侷限的地方,那就是當面對的產品有複雜的等級結構的時候,
例如,工廠除了生產家電外產品,還生產手機產品,這樣一來家電是手機就是兩大產品家族了,這兩大家族下面包含了數量眾多的產品,每個產品又有多個型號,這樣就形成了乙個複雜的產品樹了。
如果用工廠方法來設計這個產品家族系統,就必須為每個型號的產品建立乙個對應的工廠類,
當有數百種甚至上千種產品的時候,也必須要有對應的上百成千個工廠類,這就出現了傳說的類**,對於以後的維護來說,簡直就是一場災難。
抽象工廠是在工廠方法的基礎上引進了分類管理的概念
工廠方法用來建立乙個產品,它沒有分類的概念,而抽象工廠則用於建立一系列產品,所以產品分類成了抽象工廠的重點,
例如:工廠生產的所有產品都用都用大寫字母來標明它們的型號,比如冰箱,就有「冰箱-a",「冰箱-b"。
a.我們為冰箱和洗衣機分別定義兩個產品介面,以對他們進行分類。
//洗衣機介面
public
inte***ce washer
//冰箱介面
public
inte***ce icebox
b.接著,我們分別建立這兩個介面的具體產品(注意,我們需要產品進行分類,就不需要product介面了)
//洗衣機-a
public
class
washera
implements
washer
} //洗衣機-b
public
class
washerb
implements
washer
} //冰箱-a
public
class
iceboxa
implements
icebox
} //冰箱-b
public
class
iceboxb
implements
icebox
}
c.產品部分我們準備好了,接下來我們來處理工廠部分,我們先來定義工廠行為介面.
public
inte***ce factory
d.接下來我創造具體的工廠類
我們根據上面產品的介面,把型號a的產品分為一類,由乙個工廠來管理,把型號為b的產品有另乙個工廠管理,根據這個分類,我們可以實現如下的兩個具體工廠類
//建立型號為a的產品工廠
public
class
factorya
implements
factory
//建立冰箱-a
@override
public icebox createicebox()
} //建立型號為b的產品工廠
public
class
factoryb
implements
factory
//建立冰箱-b
@override
public icebox createicebox()
}
e.使用
public
static
void
main(string args) catch (exception e)
}
以後要是要生產一種c類產品,只要實現乙個factoryc工廠,在工廠裡面創造c類的產品
總結: 工廠方法和抽象工廠,都有自己的應用場景,並沒有什麼優劣之分,但在應用抽象工廠之前,要先對建立的物件進行系統的分類,這點很重要。
好的產品分類規則能為具體工廠類的選擇呼叫和以後的擴充套件提供清晰的思路.
java設計模式 (2)工廠模式
工廠模式就是自己不去例項化物件,而使用物件工廠去例項化物件,大致分3種 簡單工廠模式 工廠模式 抽象工廠模式 先定義幾個類 person類,人這個類是個父類,而人分很多種人,這裡舉例子有student類和teacher類繼承了person類。簡單工廠模式 public class personfac...
java設計模式2 工廠
工廠模式分為四種 1 簡單工廠模式 2 靜態工廠模式 3 工廠方法模式 4 抽象工廠模式 一.簡單工廠模式 用乙個工廠類,來管理,通過傳入的引數不同,各自生成不同的子類物件。以傳送資訊為例,有多種傳送方式,子類傳送方式繼承父類。通過乙個工廠類來控制,不同引數傳入返回不同的物件。public clas...
java設計模式之工廠模式(2)
工廠模式 屬於建立型模式。同我們生活中的廠家很相似。我們並不自己製造 new 產品,而是依靠廠家製造,我們只是拿來使用。簡單的說就是讓工廠 根據我們的需求給我們new乙個物件。工廠模式又分為工廠方法模式和抽象工廠模式。工廠方法模式又分為 普通工廠方法,靜態工廠方法.package com.patte...