大B:“你喜歡奧迪audi車嗎?”
小A:“嘿嘿!喜歡。”
大B:“我就舉個奧迪audi車的例子,讓你更好地理解抽象工廠模式。”
小A:“好啊!”
大B:“介紹了工廠方法的使用,從那個程序中可以看到,奧迪audi車是從audicarfactoryimple工廠中創建出來的,而大衆3W車是從threeWcarfactoryimple工廠中創建出來的,那麼如果這2家汽車生產大廠由總部在北京市,現在發展到上海,深圳等城市創建生氣汽車的分廠,該怎麼辦?是不是得將原來的奧迪汽車工廠類。”
publicclassaudicarfactoryimpleimplementsIcarfactory{
publicIcarinterfacecreatecar(){
caraudiimplecaraudiimpleref=newcaraudiimple();
caraudiimpleref.setName(“奧迪A6”);
caraudiimpleref.setSpeed(300);
returncaraudiimpleref;
}
}
改成類似如下的模樣:
publicclassaudicarfactoryimpleimplementsIcarfactory{
publicIcarinterfacecreatecar(Stringareacar){
if(areacar.equals(“北京”)){創建一個北京的奧迪汽車}
if(areacar.equals(“上海”)){創建一個上海的奧迪汽車}
if(areacar.equals(“深圳”)){創建一個深圳的奧迪汽車}
returncaraudiimpleref;
}
}
小A:“發現一個問題,不同地域的汽車卻在一個工廠中出現。”
大B:“這是不合乎常理的,因爲北京奧迪在北京分廠創建,上海奧迪在上海分廠創建,這樣纔對。所以如果遇到分‘大系’來創建對象的時候,抽象工廠方法是肯定要使用的時候了。”
小A:“什麼是‘大系’?”
大B:“這裡的大系指的就是從地域上來分。這個例子就應該以‘用抽象工廠來定義具體工廠的抽象,而由具體工廠來創建對象’。 比如在玩‘極品飛車’這款遊戲,每個地圖處都有造車的工廠,每個造車的工廠都因爲有造車的檔次不同而劃分爲高級車廠,低級車廠,那麼這樣的場景正是應用抽象工廠的好時機,再來理解一下這句話‘用抽象工廠來定義具體工廠的抽象,而由具體工廠來創建對象’,用抽象造車工廠來定義具體造車工廠的抽象,而由具體的造車工廠來創建汽車,這就是抽象工廠與工廠方法的不同,工廠方法中對象的創建是由工廠方法來確定的,創建的對象都是不分類並且實現一個接口的,而抽象工廠就是在工廠方法的基礎上對創建車的對象的行爲進行分類,比如北京車廠,上海車廠等。”
【抽象工廠模式解釋。
類型:創建模式
提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們具體的類。
【抽象工廠模式-JAVA代碼實現。
新建抽象工廠接口:
packagecarfactoryinterface;
importcarinterface.Icarinterface;
publicinterfaceIcarfactory{
publicIcarinterfacecreatethreeWcar();
publicIcarinterfacecreateaudicar();
}
新建抽象工廠接口的高級車adv工廠實現類:
packagecarfactoryimple;
importcarfactoryinterface.Icarfactory;
importcarimple.car3wimpleadv;
importcarimple.caraudiimpleadv;
importcarinterface.Icarinterface;
publicclasscarfactoryadvimplementsIcarfactory{
publicIcarinterfacecreateaudicar(){
caraudiimpleadvcaraudiimpleadv=newcaraudiimpleadv();
caraudiimpleadv.setName(“奧迪A6”);
caraudiimpleadv.setSpeed(300);
returncaraudiimpleadv;
}
publicIcarinterfacecreatethreeWcar(){
car3wimpleadvcar3wimpleadvref=newcar3wimpleadv();
car3wimpleadvref.setName(“大衆A6”);
car3wimpleadvref.setSpeed(300);
returncar3wimpleadvref;
}
}
新建抽象工廠接口的普通車low工廠實現類:
packagecarfactoryimple;
importcarfactoryinterface.Icarfactory;
importcarimple.car3wimplelow;
importcarimple.caraudiimplelow;
importcarinterface.Icarinterface;
publicclasscarfactorylowimplementsIcarfactory{
publicIcarinterfacecreateaudicar(){
caraudiimplelowcaraudiimplelowref=newcaraudiimplelow();
caraudiimplelowref.setName(“奧迪A6”);
caraudiimplelowref.setSpeed(300);
returncaraudiimplelowref;
}
publicIcarinterfacecreatethreeWcar(){
car3wimplelowcar3wimplelowref=newcar3wimplelow();
car3wimplelowref.setName(“大衆A6”);
car3wimplelowref.setSpeed(300);
returncar3wimplelowref;
}
}
上面已經有抽象工廠和具體工廠的實現類了。
新建汽車接口:
WWW● тт kΛn● ¢ o
packagecarinterface;
publicinterfaceIcarinterface{
publicvoidstart();
publicvoidstop();
}
新建汽車父類:
packagecarimple;
importcarinterface.Icarinterface;
publicclassbasecarimpleimplementsIcarinterface{
privateintspeed;
privateStringname;
publicintgetSpeed(){
returnspeed;
}
publicvoidsetSpeed(intspeed){
this.speed=speed;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicvoidstart(){
//TODOAuto-generatedmethodstub
}
publicvoidstop(){
//TODOAuto-generatedmethodstub
}
}
新建大衆高級車:
packagecarimple;
importcarinterface.Icarinterface;
publicclasscar3wimpleadvextendsbasecarimple{
publicvoidstart(){
System.out.println(富華版:+this.getName()+車以專利技術起動了最高速度爲:
+this.getSpeed());
}
publicvoidstop(){
System.out.println(富華版:“+this.getName()+”車以專利技術停車了);
}
}
新建大衆普通車:
packagecarimple;
importcarinterface.Icarinterface;
publicclasscar3wimplelowextendsbasecarimple{
publicvoidstart(){
System.out.println(普通版:+this.getName()+車以專利技術起動了最高速度爲:
+this.getSpeed());
}
publicvoidstop(){
System.out.println(普通版:“+this.getName()+”車以專利技術停車了);
}
}
新建大衆普通車:
packagecarimple;
importcarinterface.Icarinterface;
publicclasscaraudiimpleadvextendsbasecarimple{
publicvoidstart(){
System.out.println(富華版:+this.getName()+車以專利技術起動了最高速度爲:
+this.getSpeed());
}
publicvoidstop(){
System.out.println(富華版:“+this.getName()+”車以專利技術停車了);
}
}
新建奧迪普通車:
packagecarimple;
importcarinterface.Icarinterface;
publicclasscaraudiimplelowextendsbasecarimple{
publicvoidstart(){
System.out.println(普通版:+this.getName()+車以專利技術起動了最高速度爲:
+this.getSpeed());
}
publicvoidstop(){
System.out.println(普通版:“+this.getName()+”車以專利技術停車了);
}
}
新建客戶端運行類:
packagerunmain;
importcarfactoryimple.carfactoryadv;
importcarfactoryinterface.Icarfactory;
importcarinterface.Icarinterface;
publicclassrunmain{
publicstaticvoidmain(String[]args){
IcarfactoryIcarfactoryref=newcarfactoryadv();
IcarinterfaceIcarinterfaceref=Icarfactoryref
createthreeWcar();
Icarinterfaceref.start();
Icarinterfaceref.stop();
}
}
程序運行結果如下:
富華版:大衆A6車以專利技術起動了最高速度爲:300
富華版:大衆A6車以專利技術停車了
一開始只在後花園中種蔬菜類的時候可以用簡單工廠模式,由工廠負責生成具體的蔬菜類,
但是如果後花園要引進水果類的時候簡單模式就行不通了,因此需要使用工廠方法模式,將產品類族分開。
但是如果後花園的規模繼續擴大到地域範圍的分割時,比如說一個在北京,一個在上海的時候,工廠方法模式就不夠了,因爲對兩個後花園來說,每個後花園的植物是要被種在一起的,並且兩個後花園用工廠方法模式是無法體現其區別的。
從程序中可以看到,工廠是抽象的,工廠的實現是不一樣的,不同的工廠創建出不同汽車。而工廠方法僅僅是用一個工廠去創建很多汽車。