Abstract Factory模式是對Factory Method模式的進一步演變。Factory Method所要解決的是new的問題。而Abstract Factory模式則試圖為建立一系列産品提供統一的接口。當需要建立某一系列産品的時候,可以從抽象工廠中選擇相應的系列建立一個具體的工廠類。
設計模式(四):Abstract Factory模式 OK,我們現在就來假設一個場景,比如需要一個GUI(圖形使用者界面),它既可以顯示Windows風格的按鈕,也可以顯示OSX風格的按鈕。這個時候我們就可以抽象出一個Button類,它作為WinButton和OSXButton的抽象基類,它們則代表着具體的“産品”。作為生産這些“産品”對應的工廠,WinFactory和OSXFactory則繼承自一個AbstractFactory。這樣,當用戶端(Client)代碼在建立相應的“産品”的時候,它并不知道具體“産品”,以及具體“工廠”的細節,和它打交道的都是接口或者抽象類。這很好展現了一個面向對象設計原則“針對接口程式設計,而不要針對實作程式設計”。(注:這裡的接口并不是狹義的語言中的interface,它是指的廣義的超類型(supertype) )
Java代碼:
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 abstract class GUIFactory
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public static GUIFactory getFactory()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 int sys = readFromConfigFile("OS_TYPE");
設計模式(四):Abstract Factory模式 if (sys == 0)
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 return new WinFactory();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 else
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 return new OSXFactory();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 public abstract Button createButton();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 class WinFactory extends GUIFactory
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public Button createButton()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 return new WinButton();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 class OSXFactory extends GUIFactory
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public Button createButton()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 return new OSXButton();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 abstract class Button
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public abstract void paint();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 class WinButton extends Button
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public void paint()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 System.out.println("I'm a WinButton: ");
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 class OSXButton extends Button
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public void paint()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 System.out.println("I'm a OSXButton: ");
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 public class Application
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public static void main(String[] args)
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 GUIFactory factory = GUIFactory.getFactory();
設計模式(四):Abstract Factory模式 Button button = factory.createButton();
設計模式(四):Abstract Factory模式 button.paint();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 // Output is either:
設計模式(四):Abstract Factory模式 // "I'm a WinButton:"
設計模式(四):Abstract Factory模式 // or:
設計模式(四):Abstract Factory模式 // "I'm a OSXButton:"
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 C#代碼:
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 abstract class GUIFactory
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public static GUIFactory GetFactory()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 int sys = ReadFromConfigFile("OS_TYPE");
設計模式(四):Abstract Factory模式 if (sys == 0)
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 return new WinFactory();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 else
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 return new OSXFactory();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 public abstract Button CreateButton();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 class WinFactory : GUIFactory
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public override Button CreateButton()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 return new WinButton();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 class OSXFactory : GUIFactory
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public override Button CreateButton()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 return new OSXButton();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 abstract class Button
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public string Caption;
設計模式(四):Abstract Factory模式 public abstract void Paint();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 class WinButton : Button
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public override void Paint()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 Console.WriteLine("I'm a WinButton: " + Caption);
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 class OSXButton : Button
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 public override void Paint()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 Console.WriteLine("I'm a OSXButton: " + Caption);
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 class Application
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ... {
設計模式(四):Abstract Factory模式 static void Main()
設計模式(四):Abstract Factory模式
設計模式(四):Abstract Factory模式 ...{
設計模式(四):Abstract Factory模式 GUIFactory factory = GUIFactory.GetFactory();
設計模式(四):Abstract Factory模式 Button button = factory.CreateButton();
設計模式(四):Abstract Factory模式 button.Caption = "Play";
設計模式(四):Abstract Factory模式 button.Paint();
設計模式(四):Abstract Factory模式 }
設計模式(四):Abstract Factory模式 // Output is either:
設計模式(四):Abstract Factory模式 // "I'm a WinButton: Play"
設計模式(四):Abstract Factory模式 // or:
設計模式(四):Abstract Factory模式 // "I'm a OSXButton: Play"
設計模式(四):Abstract Factory模式 }
在分層架構中,DAO層(資料存取對象 Data Access Object)會根據具體情況采用Abstract Factory模式和Factory Method模式建構DAO層。