目录
什么是抽象工厂模式
抽象工厂模式是针对多种抽象对象统一使用的创建模式,使得客户端可以在不指定具体产品的情况下,创建具体对象。
为什么要用抽象工厂模式
抽象工厂模式具有良好的封装性,使得客户端高层不必关心具体的对象是如何创建的,只需要知道通过哪个工厂类来创建。而具体的对象创建逻辑交给具体的工厂类就好了。
抽象工厂模式组成
抽象产品
public abstract class AbstractProduct {
public abstract void display();
public abstract void foo();
}
抽象产品A
public abstract class AbstractProductA extends AbstractProduct {
@Override
public void display() {
System.out.println("A display");
}
}
抽象产品B
public abstract class AbstractProductB extends AbstractProduct {
@Override
public void display() {
System.out.println("B display");
}
}
具体产品A1
public class ProductA1 extends AbstractProductA{
@Override
public void foo() {
System.out.println("Product A1 Method foo");
}
}
具体产品A2
public class ProductA2 extends AbstractProductA{
@Override
public void foo() {
System.out.println("Product A2 Method foo");
}
}
具体产品B1
public class ProductB1 extends AbstractProductB{
@Override
public void foo() {
System.out.println("Product B1 Method foo");
}
}
具体产品B2
public class ProductB2 extends AbstractProductB{
@Override
public void foo() {
System.out.println("Product B2 Method foo");
}
}
抽象工厂类
public abstract class AbstractFactory {
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
具体工厂类1
public class Creator1 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
具体工厂类2
public class Creator2 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
测试驱动
public class Main {
public static void main(String[] args) {
AbstractFactory f1 = new Creator1();
AbstractFactory f2 = new Creator2();
AbstractProductA a1 = f1.createProductA();
AbstractProductA a2 = f2.createProductA();
AbstractProductB b1 = f1.createProductB();
AbstractProductB b2 = f2.createProductB();
a1.display();
a1.foo();
a2.display();
a2.foo();
b1.display();
b1.foo();
b2.display();
b2.foo();
}
}
需要注意的几点
从抽象工厂模式的组成上很容易的看出,如果需要对产品进行扩展是很困难的,比如说需要增加ProductC,那么就需要改造AbstractFactory 增加createProductC的方法。这样会带来子类工厂都需要改写。 虽然对产品的扩展是困难的,但是对产品型号的扩展却是很容易的,比如这里需要增加3这个产品型号,只需要对应的增加一个Creator3工厂即可,而无需改动其他。