模式解讀
abstract 是「抽象」,factory 是「工廠」,所以合起來abstract factory 就是「抽象工廠」的意思。abstract factory pattern 中的抽象工廠則是把各種抽象零件合成抽象產品。換句話說,處理的重點是在介面(api)而不是零件的具體實現。只利用介面(api)就能把零件組合成產品。
模板方法模式和生成模式的情形 是在子類進行具體的實現,而抽象工廠模式也同樣是由子類來處理具體 的實現。在子類就會出現具體工廠利用具體零件組合而成的具體產品。
程式示例
本篇涉及的類較多,較之單例模式而言理解真來比較難。一步步來吧。
本例將使用抽象工廠,製作輸出乙個html語言顯示在android 的文字上。由於涉及模擬較多,先上uml圖,再一一解釋:
抽象零件:item 類
caption欄位 是此專案的「標題」。
makehtml 方法是抽象方法,須等待子類進行實現。一旦呼叫 此方法時,其返回值即為html字串(子類要有這樣的執行功能)。
**:public abstract class item
public abstract string makehtml();
抽象零件:link 類
link 類是以抽象方式表示 html超連結的類。
url 字段用來儲存超鏈**的url。該抽象類實現item 抽象類。
** :
/*** 以抽象方式 表示html超連結的類
* @author administrator**/
public abstract class link extends item
}抽象零件:tray類
tray 類是表示 收集乙個以上的link 或tray 類。
link 和tray 則利用add 方法把它們 找出來。add 方法對於「link」和「tray」 這部分的表現方式則是將link 和 tray 的父類item 設為引數。
tray 類繼承 了item 類的抽象方法makehtml,但並未實現。所以tray 類也是抽象類。
** :
/*** 表示收集乙個以上的link 或tray的類
* @author administrator**/
public abstract class tray extends item
public void add(item item)
}抽象產品:page 類
page 類則是以抽象的方式表現整個html網頁的類。如果說link和tray是抽象零件,那麼page 類就可以說是抽象的「產品」(負責最終輸出html)。title欄位是網頁的標題,author 是網頁的作者。最後以output 輸出資料。
** :
/*** 以抽象的方式表現整個html網頁的類
* * @author administrator
* */
public abstract class page
public void add(item item)
抽象產品參與 者規定由抽象工廠參與者所產生的抽象零件和產品的介面(api)。扮演這個參與者的是link類、tray 類和page 類。
抽象工廠:factory 類
該類包含乙個getfactory 方法,利用引數class>得到乙個類的物件例項。
在抽象工廠製作零件或產品時,會用到createlink、createtray、createpage這幾個方法。這些方法都是抽象方法,實際上的具體零件和產品製作過程則交給factory 的子類來處理,方法是由這裡來規定。
** :
/*** 抽象工廠,在抽象工廠通過各個零件製作成產品
* * @author administrator
* */
public abstract class factory catch (instantiationexception e) catch (illegalacces***ception e)
return factory;
}public abstract link createlink(string caption, string url);
public abstract tray createtray(string caption);
public abstract page createpage(string title, string author);
}抽象工廠參與者則規定用來產生抽象產品參與者的物件例項的介面 (api),扮演這個角色的是factory 類。
具體工廠:listfactory 類
該類實現factory 類的抽象方法createlink 、createtray、createpage。這裡的實現工具呼叫 new 函式把listlink 、listtray 、listpage 建立出來(可以利用之前寫過的prototype 進行clone) 。
**:/**
* 具體工廠
* * @author administrator
* */
public class listfactory extends factory
@override
public page createpage(string title, string author)
@override
public tray createtray(string caption)
}具體零件:listlink 類
該類為link 的子類,負責實現link 的makehtml抽象方法。
**:public class listlink extends link
@override
public string makehtml()
}具體零件:listtray類
該類為tray 的子類,同上文一樣負責實現抽象類tray 的makehtml方法。
**:public class listtray extends tray
@override
public string makehtml()
抽象零件:listpage類
原理與上文相似。
**:public class listpage extends page
\n");
return sb.tostring();}}
具體產品參與者是實現抽象產品參與者的介面(api)。扮演這個角色分別為:listlink 類、listtray 類、listpage類。
利用工廠把零件組合成產品:abstractfactorypatternactivity 類
該類是介面ui展示入口,負責將抽象工廠的抽象零件和具體產品組裝打包,通過傳入建立的具體工廠,組裝具體產品。利用output 輸出。
**:public class abstractfactorypatternactivity extends activity
});}
}客戶參與者是乙個只使用抽象工廠參與者和抽象產品參與者的介面 (api)來完成 工作 的參與者。客戶參與者並不知道具體零件、產品或工廠。而上面的**就是負責做這件事。
Abstract Factory抽象工廠模式
abstract factory抽象工廠模式 抽象工廠是一種建立型模式,是為了解決例項化時所帶來的問題。我們先來看看是什麼問題,有的時候我們會遇到這種情況,我們需要一系列的物件。舉個例子,有一系列bmw汽車零部件的物件 輪子bmwwheel,油箱bmwoilbox,在乙個管理函式中呼叫它們,如下 c...
Abstract Factory 抽象工廠模式
工廠模式中有 工廠方法 factory method 抽象工廠 abstract factory 這兩個模式沒有很明顯的區別,區別在於需要建立物件的複雜程度上。如果我們建立物件的方法變得複雜了,我們就可能要將上例中factory變成抽象類,將共同部分封裝在抽象類中,不同部分使用子類實現。下面關於是在...
Abstract Factory 抽象工廠模式
根據uml圖簡單 進行演示過程如下 product.h ifndef product h define product h class abstractproducta class abstractproductb class producta1 public abstractproducta cl...