一.簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式框仔,但不屬于23種GOF設(shè)計(jì)模式之一庸娱。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類(lèi)的實(shí)例。簡(jiǎn)單工廠模式是工廠模式家族中最簡(jiǎn)單實(shí)用的模式俩垃,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)
簡(jiǎn)單理解為如果需要為一個(gè)接口new 不同的對(duì)象沈撞,不需要直接new 對(duì)象慷荔,而是由工廠類(lèi)去創(chuàng)建對(duì)象,直接調(diào)用工廠類(lèi)的創(chuàng)建方法即可
好處就是調(diào)用方不關(guān)心創(chuàng)建對(duì)象的實(shí)現(xiàn)邏輯缠俺,直接調(diào)用工廠類(lèi).create 方法即可显晶,傳入不同的參數(shù),工廠類(lèi)里面通過(guò)這個(gè)參數(shù)壹士,用各種if else 來(lái)new 不同的對(duì)象吧碾,顯然這不符合開(kāi)閉原則,每次新加一個(gè)接口的實(shí)現(xiàn)類(lèi)墓卦,需要在工廠類(lèi)里面加一個(gè)if判斷 倦春,這個(gè)模式適用于 接口的實(shí)現(xiàn)類(lèi)基本固定,或者很少(3個(gè)左右)的情況
interface?ICar{
? ? void getCar();
}
class?SportCar? implement?ICar {
?void getCar(){//跑車(chē) }?
}
class?JeepCar?implement?ICar?{
?void getCar(){//吉普車(chē) }?
}
class Facatory{
? ? ? ? public ICar getCar(String name)
? ? ? ? {
? ? ? ? ? ? switch (name)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? case "Sport":
? ? ? ? ? ? ? ? ? ? return new SportCar();
? ? ? ? ? ? ? ? case CarType.JeepCarType:
? ? ? ? ? ? ? ? ? ? returnnew JeepCar();
? ? ? ? ? ? ? ? case "Jeep":
? ? ? ? ? ? ? ? ? ? return new JeepCar?();
? ? ? ? ? ? }
? ? ? ? }
}
main {
Facatory f = new?Facatory()落剪;
ICar? car1 = f.getCar("Sport");
ICar? car2 = f.getCar("Jeep");
}
二.工廠方法模式
此模式是在簡(jiǎn)單工廠模式基礎(chǔ)上擴(kuò)展睁本,簡(jiǎn)單工廠模式只有一個(gè)工廠實(shí)現(xiàn)類(lèi),有一個(gè)創(chuàng)建方法忠怖,內(nèi)部各種if判斷來(lái)new對(duì)象呢堰,二工廠方法則是:有一個(gè)工廠的抽象類(lèi),里面有一個(gè)接口的抽象方法凡泣,這個(gè)方法和接口的方法一摸一樣枉疼,都是抽象的,然后由這個(gè)工廠的不同工廠實(shí)現(xiàn)工廠類(lèi)去實(shí)現(xiàn)這個(gè)方法鞋拟,方法內(nèi)部就是一個(gè)個(gè)new 不同工廠業(yè)務(wù)對(duì)應(yīng)的對(duì)象骂维,調(diào)用的時(shí)候就直接new 不同的實(shí)現(xiàn)工廠類(lèi)即可
interface?ICar{
? ? void getCar();
}
class?SportCar?implement?ICar?{
?void getCar(){//跑車(chē) }?
}
class?JeepCar?implement?ICar?{
?void getCar(){//吉普車(chē) }?
}
interface?Facatory{//這里也可以寫(xiě)抽象類(lèi),然后寫(xiě)公共方法贺纲,調(diào)用抽象方法航闺,簡(jiǎn)單就用接口和接口方法理解
?ICar getCar();
}
class?SportCarFacatory?implement?Facatory?{
?ICar?getCar(){ return new? SportCar ();}?
}
class?JeepCarFacatory?implement?Facatory{
?ICar?getCar(){return new?JeepCar?() }?
}
main{
Facatory f1 =?new?SportCarFacatory?();
ICar? car1 = f1.getCar();
Facatory f2 =?new?JeepCarFacatory?();
ICar? car2 = f2.getCar();
}
優(yōu)點(diǎn)很明顯潦刃,擴(kuò)展很麻煩侮措,新加一種類(lèi)型的車(chē),就新加一個(gè)類(lèi)型的工廠類(lèi)乖杠,不像簡(jiǎn)單工廠那樣去工廠類(lèi)里面加if判斷分扎,缺點(diǎn)就是類(lèi)太多了,如果有很多類(lèi)型的車(chē)的話(huà)
三.抽象工廠
就是不僅僅生產(chǎn)車(chē)胧洒,還會(huì)生產(chǎn)電腦畏吓,這樣的業(yè)務(wù),就是有一個(gè)抽象工廠類(lèi)略荡,里面有不同的抽象方法,產(chǎn)生不同的實(shí)現(xiàn)工廠
interface?ICar{
? ? void getCar();
}
class?SportCar?implement?ICar?{
?void getCar(){//跑車(chē) }?
}
class?JeepCar?implement?ICar?{
?void getCar(){//吉普車(chē) }?
}
不僅僅只有車(chē)子的業(yè)務(wù)歉胶,還有電腦的業(yè)務(wù)
interface?IComputer{
? ? void getComputer();
}
class?NoteBookComputer implement?IComputer{
?void getComputer(){//筆記本 }?
}
class?PCComputer?implement?IComputer{
void?getComputer(){//臺(tái)式機(jī)}
}
abstract?Facatory{//抽象工廠
ICar?getCar();
IComputer?getComputer();
}
class Facatory1 implement?Facatory?{//工廠1生產(chǎn)跑車(chē)和筆記本
ICar?getCar(){ return new?SportCar ();}
IComputer?getComputer(){return new?NoteBookComputer (); }
}
class?Facatory1implement?Facatory{//工廠2生產(chǎn)吉普車(chē)和臺(tái)式機(jī)
ICar?getCar(){return new?JeepCar?()汛兜; }
IComputer?getComputer(){return new?PCComputer?();?}
}
main{
Facatory f1 = new?Facatory1 ();
f1.getCar();
f1.getComputer();
Facatory f2 = new?Facatory2 ();
f2.getCar();
f2.getComputer();
}
可以看到一個(gè)產(chǎn)品可以產(chǎn)生一組業(yè)務(wù),而每一組業(yè)務(wù)由不同的工廠產(chǎn)生通今,如果再加一個(gè)業(yè)務(wù)粥谬,如生產(chǎn)衣服,則需要改很多類(lèi)的代碼辫塌,不符合開(kāi)閉原則