天天看點

設計模式(四):Abstract Factory模式

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層。

繼續閱讀