工廠模式主要用一下幾種形態:
1:簡單工廠(****** factory)。
2:工廠方法(factory method)。
3:抽象工廠(abstract factory)。
又叫靜態工廠,是工廠模式三中狀態中結構最為簡單的。主要有乙個靜態方法,用來接受引數,並根據引數來決定返回實現同一介面的不同類的例項。我們來看乙個具體的例子:
假設一家工廠,幾生產洗衣機,有生產冰箱,還有空調等等..
我們先為所有產品定義乙個共同的產品介面
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 inte ce factoryinter接著是兩個實現 public class bmwproduce implements factoryinter public class audiproduce implements factoryinter 然後提供乙個新...
java設計模式之二 工廠方法模式
在簡單工廠模式中,建立類的工作都交給了工廠類來處理。這樣一來,假如專案非常龐大,工廠類就難以維護。那麼,可以通過將工廠抽象出來,形成乙個介面,具體的工廠類實現抽象類的介面。這樣一來,核心的工廠類可以不必負責產品的建立,僅負責定義具體工廠類必須實現的介面,形成乙個規範。這樣的好處是,可以使系統在不修改...
設計模式之二 簡單工廠模式
前言 簡單工廠模式根據提供的資料或者引數返回幾個可能的類中的乙個例項,說通俗點有點像物件導向程式設計中的多型性,乙個基類,有多個派生類,在另外的呼叫程式中,根據引數來決定返回這個基類的哪個具體的派生類,返回值為基類型別,因為基類的引用可以指向派生類物件,而且這些所有的派生類都包含有基類的函式,也就是...