###引言
在前面的設計模式中,我們在類的編寫過程都是直接 new 乙個物件,但是這是建立在你可以明確的知道可以建立哪乙個物件的前提下,那麼我們可以在編譯階段去直接例項化,但是有時候我們需要動態的選擇例項化哪乙個物件,這個時候就需要工廠模式來***建立乙個物件***了,我們就可以獲取乙個物件而不需要去考慮物件的建立過程,將這個過程拋給工廠去管理,實現解耦。
我們以汽車為例子:
不使用工廠模式
比如現在乙個人要一輛奧迪的車,不使用工廠模式,直接 new 乙個物件,那你自己去造一輛奧迪出來吧。
public audi getcar
() 複製**
可是奧迪有很多車型吧,你需要指定車型
public audi getcar(string type) else
if(type.equals("a4")) else
if(type.equals("r8"))
return audi;
}複製**
然而,每個人的時間都是寶貴的,我乙個不是專門造車的人,有造車的時間我可以去做我自己專業領域更多的事,而且當有奧迪的新車型出來或者舊車型停產的時候我們就要去修改方法。那這個時候我們就可以使用工廠模式,工廠來專門造車,我只要去買就行了(錢多麻煩少,有錢真好......)。
簡單工廠模式
建立乙個audi的簡單工廠
public class ******audifactory else
if(type.equals("a4")) else
if(type.equals("r8"))
return audi; }}
複製**
使用者想要車現在不用自己去造車了,只需要指定車型由工廠去造車。
public class audistore
public audi getcar(string type)
}複製**
工廠方法模式
定義:工廠方法模式定義了乙個建立物件的介面,但是由其子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到了子類。
這裡要注意,這個「讓子類決定「,並不是說讓子類在執行的時候去決定,而是說對於建立者(下面例子中的 audistore 抽象類)來說並不需要知道實際建立了什麼物件,建立者選擇了什麼子類那麼實際建立的物件也就決定了,其實還是建立者的決定權。其次,通過讓子類去具體實現建立物件,讓建立者與實際產品實現了解耦,因為真正的耦合關係是在具體建立者和具體產品之間的耦合。
現在奧迪要走向全世界,每個國家的使用者使用習慣不一樣,日本的使用者駕駛座椅要離剎車油門踏板近一點(你懂得...),英國使用者的方向盤需要放在右邊。乙個工廠除了要造車還要考慮各種各樣的差別,為新車型多增加生產線。怎麼辦?全世界開分店。每個國家的分店只需要考慮自己國家的車型就好了,但要說好你們這些店本質上還是屬於我奧迪的品牌,別給別人賣個寶馬了(可以從audi超類中控制,控制子類必須時audi車)。這樣哪個國家的人想要奧迪,去自己家的奧迪專賣店就行了。
public abstract class audistore
//所有分店自己來處理本地化奧迪車的生產,別生產賣個寶馬就行
protected abstract audi createaudi(string type);
}複製**
日本奧迪店
public class japanaudistore extends audistore else
if(type.equals("a4")) else
if(type.equals("r8"))
return audi; }}
複製**
英國奧迪店
public class ukaudistore extends audistore else
if(type.equals("a4")) else
if(type.equals("r8"))
return audi; }}
複製**
現在使用者買車要先宣告自己是哪個國家的奧迪才會給你你那個國家的車
public class audiglobalstore
}複製**
獲取audi的過程是首先跟奧迪店(audistore類)的 getcar 獲取車,getcar 會呼叫奧迪店的 createaudi 方法,但是這個方法是抽象的,具體的例項化一輛奧迪車出來,是通過其子類重寫的 createaudi 方法例項出來的。
抽象工廠模式
以奧迪分店為例,奧迪為了保證全球奧迪汽車的品質,防止分店為了削減成本偷工減料,導致品牌的榮譽受損,現在為全球的奧迪汽車提供奧迪的零件,但是考慮到每個地區的差異,會提供差異化的零件,同時一些零件提供通用版本,由各地零售店組裝。
每一輛奧迪簡單描述為三個部分:輪胎(tyre),車身(body),內飾(interior)。 首先定義乙個零件工廠介面,介面定義所有實現此零件工廠的類都會創造這三個零件的方法。
public inte***ce audipartsfactory
複製**
同時定義三個零件的超類,超類下會有不同地區的零件子類。定義不同地區的零件工廠
//英國奧迪零件工廠
public class ukaudipartsfactory implements audipartsfactory
//英國地區的奧迪使用uk定製的車身和內飾
public body createbody
() public interior createinterior()}
// 日本奧迪零件工廠
public class japanaudipartsfactory implements audipartsfactory
public body createbody
() public interior createinterior()}
複製**
之前我們為了區分不同的地區的audi車,定義了japanaudia3,ukaudia3之類的不同的類,現在有不同的零件工廠,我們可以使用不同的零件工廠來生產不同地區的不同的車,而不需要定義不同的類。
改造一下audi超類
public abstract class audi
複製**
改造具體的車型
public class audia3 extends audi
void prepare()}
複製**
之前我們的零售店是這樣的
public class ukaudistore extends audistore else
if(type.equals("a4")) else
if(type.equals("r8"))
return audi;
}}複製**
現在有了不同的零件工廠後我們改造如下。
public class ukaudistore extends audistoreelse
if(type.equals("a4")) else
if(type.equals("r8"))
return audi;
} }複製**
抽象工廠模式一般會定義兩個家族,乙個是工廠家族,乙個產品家族(每個具體的工廠都能生產乙個或者一組產品)。
總結工廠模式主要是為了將具體的類的實現給抽取出來,降低我們的程式對於具體的類的依賴減小。不是依賴乙個具體的類而是依賴具體類的抽象。 這裡還要提乙個設計模式裡面的原則「依賴倒置原則」:不要讓高層的去依賴底層元件,而是依賴於抽象,這裡的高低層的區別在於抽象層次的高低,具體的類就屬於低階的層次,而一般類的抽象超類或者介面就屬於高階的層次。
設計模式(四)工廠模式
以武哥的女媧造人為例 女媧生產人,人有黑白黃三種,同時會說 1 介面類為 package 工廠模式 public inte ce human2 下面捏各種人模子 白 package 工廠模式 public class whilteman implements human override publi...
設計模式四 工廠模式
工廠模式定義 乙個用於建立物件的介面,讓子類決定例項化哪乙個類。例項化延遲到其子類。只對結果負責。解耦合spring 中 abstractfactorybean 建立物件使用了工廠模式,很好的詮釋了 依賴倒置原則 要依賴抽象,不要依賴具體。public class factory else if 伊...
java設計模式 工廠模式
工廠模式 存在的目的 定義乙個用於建立複雜類的物件的介面。使用工廠模式,降低了類與類之間的耦合關係。分為三種實現方式 類之間的繼承結構不同 簡單工廠模式 工廠方法模式 抽象工廠模式。主要涉及的三種類 呼叫工廠的類,工廠類,產品類。先看乙個不適用工廠模式的類組織 class bmw32 class b...