Provides an interface for creating families of related or dependent objects without specifying their concrete classes.
1.就是提供一个接口,这个接口的目的是创建对象。
2.创建什么样的对象?创建有族群关系的对象。
所谓的产品族群,是指位于不同产品等级结构中功能相关联的产品组成的家族
3.怎么创建?不通过制定具体的类型。
1.我们有一个抽象工厂接口:
所有的具体工厂都要通过实现这个接口来生产(创建)对象。
2.几个(两个)实现这个抽象工厂的具体工厂,工厂A、工厂B。
工厂A生成A系列的产品。
工厂B生成B系列的产品。
3.因为A、B不止单一的产品,他们各自有一族产品(产品A族,B族分别包括很多产品),所以这里有另个抽象的A、B产品定义。
AbstractProductB
4.客户端 只与 AbstractFactory、 AbstractProductB、AbstractProductA交互。并且客户端完全不知道实现类的存在,只在运行时决定获取哪个具体的工厂实现 去完成具体产品的创建。
也就是说,客户端完全与具体的实现解耦。另外一点,新的产品族也很灵活的被加入(易扩展)。怎么加入?通过去创建一个实现了抽象工厂的实现类(ConcreteFactoryC、ConcreteFactoryD…),并且相应的创建实现了抽象产品族(AbstractProductC、AbstractProductD…)的具体产品。
当你要创建多个产品(对象)族或一系列的产品,但是不希望暴漏关于创建产品的实现细节。因为,客户端(调用者)与具体实现完全解耦。
//Our AbstractProduct
public interface Window {
public void setTitle(String text);
public void repaint();
}
//ConcreteProductA1
public class MSWindow implements Window
{
public void setTitle()
{
//MS Windows specific behaviour
}
public void repaint()
{
//MS Windows specific behaviour
}
}
//ConcreteProductA2
public class MacOSXWindow implements Window
{
public void setTitle()
{
//Mac OSX specific behaviour
}
public void repaint()
{
//Mac OSX specific behaviour
}
}
//AbstractFactory
public interface AbstractWidgetFactory
{
public Window createWindow();
}
//ConcreteFactory1
public class MsWindowsWidgetFactory implements AbstractWidgetFactory
{
//create an MSWindow
public Window createWindow()
{
MSWindow window = new MSWindow();
return window;
}
}
//ConcreteFactory2
public class MacOSXWidgetFactory implements AbstractWidgetFactory
{
//create a MacOSXWindow
public Window createWindow()
{
MacOSXWindow window = new MacOSXWindow();
return window;
}
}
//Client
public class GUIBuilder
{
public void buildWindow(AbstractWidgetFactory widgetFactory)
{
Window window = widgetFactory.createWindow();
window.setTitle("New Window");
}
}
public class Main{
public static void main(String[] args)
{
GUIBuilder builder = new GUIBuilder();
AbstractWidgetFactory widgetFactory = null;
//check what platform we‘re on
if(Platform.currentPlatform()=="MACOSX")
{
widgetFactory = new MacOSXWidgetFactory();
}
else
{
widgetFactory = new MsWindowsWidgetFactory();
}
builder.buildWindow(widgetFactory);
}
}
于是,我们在客户端就通过抽象的产品接口,获取具体的产品。
有没有发现一个问题?抽象工厂其实是借助具体工厂的手来动态的获取具体产品。那具体工厂就和客户端耦合了,难道不应该动态获取么?为什么要实例化?
原文地址:http://blog.csdn.net/lemon89/article/details/46612323