Abstract Factory模式是对Factory Method模式的进一步演变。Factory Method所要解决的是new的问题。而Abstract Factory模式则试图为创建一系列产品提供统一的接口。当需要创建某一系列产品的时候,可以从抽象工厂中选择相应的系列创建一个具体的工厂类。
OK,我们现在就来假设一个场景,比如需要一个GUI(图形用户界面),它既可以显示Windows风格的按钮,也可以显示OSX风格的按钮。这个时候我们就可以抽象出一个Button类,它作为WinButton和OSXButton的抽象基类,它们则代表着具体的“产品”。作为生产这些“产品”对应的工厂,WinFactory和OSXFactory则继承自一个AbstractFactory。这样,当客户端(Client)代码在创建相应的“产品”的时候,它并不知道具体“产品”,以及具体“工厂”的细节,和它打交道的都是接口或者抽象类。这很好体现了一个面向对象设计原则“针对接口编程,而不要针对实现编程”。(注:这里的接口并不是狭义的语言中的interface,它是指的广义的超类型(supertype) )
Java代码:
OK,我们现在就来假设一个场景,比如需要一个GUI(图形用户界面),它既可以显示Windows风格的按钮,也可以显示OSX风格的按钮。这个时候我们就可以抽象出一个Button类,它作为WinButton和OSXButton的抽象基类,它们则代表着具体的“产品”。作为生产这些“产品”对应的工厂,WinFactory和OSXFactory则继承自一个AbstractFactory。这样,当客户端(Client)代码在创建相应的“产品”的时候,它并不知道具体“产品”,以及具体“工厂”的细节,和它打交道的都是接口或者抽象类。这很好体现了一个面向对象设计原则“针对接口编程,而不要针对实现编程”。(注:这里的接口并不是狭义的语言中的interface,它是指的广义的超类型(supertype) )
Java代码:
/*
* GUIFactory example
*/
abstract class GUIFactory
{
public static GUIFactory getFactory()
{
int sys = readFromConfigFile("OS_TYPE");
if (sys == 0)
{
return new WinFactory();
}
else
{
return new OSXFactory();
}
}
public abstract Button createButton();
}
class WinFactory extends GUIFactory
{
public Button createButton()
* GUIFactory example
*/
abstract class GUIFactory
{
public static GUIFactory getFactory()
{
int sys = readFromConfigFile("OS_TYPE");
if (sys == 0)
{
return new WinFactory();
}
else
{
return new OSXFactory();
}
}
public abstract Button createButton();
}
class WinFactory extends GUIFactory
{
public Button createButton()