抽象工厂可以创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂需要产生一个和产品相同的继承结构,从而产生出可以生产各种产品的工厂,在使用时,我们可以将不同的工厂注入Client,从而产生不同的产品。
Window作为公用的产品系列,包含WindowsWindow和LinuxWindow两个具体的产品,而WidgetFactory作为产品的抽象工厂接口,其中的createWindow方法是可以产生产品,但是它不实现生产的过程,而是由它的子类,WindowsWidgetFactory和LinuxWidgetFactory来实现产品的实现过程。
public interface Window {
public void show();
}
public class WindowsWindow implements Window{
@Override
public void show() {
System.out.println("Show Windows' window!");
}
}
public class LinuxWindow implements Window{
@Override
public void show() {
System.out.println("Show Linux's window!");
}
}
public interface WidgetFactory {
public Window createWindow();
}
public class WindowsWidgetFactory implements WidgetFactory{
@Override
public Window createWindow() {
return new WindowsWindow();
}
}
public class LinuxWidgetFactory implements WidgetFactory{
@Override
public Window createWindow() {
return new LinuxWindow();
}
}
//test
public class TestMain {
public static void Client(WidgetFactory facotry) {
Window win = facotry.createWindow();
win.show();
}
public static void main(String[] args) {
String env = "windows";
WidgetFactory facotry = null;
if("windows".equals(env)){
facotry= new WindowsWidgetFactory();
} else {//linux
facotry = new LinuxWidgetFactory();
}
Client(facotry);
}
}
这种模式 可以分离具体的类,因为工厂负责创建产品对象,从而将客户与类的实现分离; 易于交换产品系列,因为应用中仅在初始化时才会创建具体的工厂并使用抽象工厂创建完整的产品系列,所以修改产品时只需修改具体的产品工厂实例即可; 易于保证产品的一致性,因为抽象工厂只会生产同一个产品系列而不会同时生产多种。这种模式的缺点在于拓展新产品系列时,需要构建与新产品系列结构完全相同的工厂集合。