简介
抽象工厂模式是对工厂方法模式的扩展。工厂方法模式里,每个工厂只能创建一个对应的商品。抽象工厂模式里,工厂的接口里是一系列创造抽象产品的方法,而不再是一个,抽象产品也不再是一个了,而是一系列相关的产品。
例子
假设有两个生产产商 Factory1(联想) 和 Factory2(华硕),这两个厂商都会生产商品 ProductA(电脑) 和 Product B(鼠标)。但两个产商生产的电脑和鼠标又是不同的,分别记为 ProductA1(联想电脑),ProductB1(联想鼠标),ProductA2(华硕电脑),ProductB2(华硕鼠标)。
商品类
对于每个商品来讲,都有一个抽象接口,定义了商品的方法。
电脑接口 IProductA
public interface IProductA {
public void method();
}
鼠标接口 IProductB
public interface IProductB {
public void method();
}
联想电脑类 ProductA1
public class ProductA1 implements IProductA {
@Override
public void method() {
System.out.println("Method for Product [A1] 联想电脑");
}
}
华硕电脑类 ProductA2
public class ProductA2 implements IProductA {
@Override
public void method() {
System.out.println("Method for Product [A2] 华硕电脑");
}
}
联想鼠标类 ProductB1
public class ProductB1 implements IProductB {
@Override
public void method() {
System.out.println("Method for Product [B1] 联想鼠标");
}
}
华硕鼠标类 ProductB2
public class ProductB2 implements IProductB {
@Override
public void method() {
System.out.println("Method for Product [B2] 华硕鼠标");
}
}
工厂类
对于产商来讲,也有一个接口,定义了生产电脑和鼠标的接口方法。
接口 IFactory
public interface IFactory {
public IProductA createProductA();
public IProductB createProductB();
}
联想公司 Factory1
public class Factory1 implements IFactory {
@Override
public IProductA createProductA() {
return new ProductA1();
}
@Override
public IProductB createProductB() {
return new ProductB1();
}
}
华硕公司 Factory2
public class Factory2 implements IFactory {
@Override
public IProductA createProductA() {
return new ProductA2();
}
@Override
public IProductB createProductB() {
return new ProductB2();
}
}
测试类 Test
public class Test {
public static void main(String[] args) {
IFactory factory1 = new Factory1();
IFactory factory2 = new Factory2();
IProductA productA1 = factory1.createProductA();
productA1.method();
IProductB productB1 = factory1.createProductB();
productB1.method();
IProductA productA2 = factory2.createProductA();
productA2.method();
IProductB productB2 = factory2.createProductB();
productB2.method();
}
}
执行结果
类图
总结
由于抽象工厂定义后,抽象产品的个数就已经固定,所以最好在抽象产品的个数不太会变化的情况下使用抽象工厂模式。
从简单工厂模式——工厂方法模式——抽象工厂模式,总结如下:
- 工厂方法模式弥补了简单工厂模式对修改开放的弊端,工厂方法模式模式遵循了开闭原则。
- 从工厂方法模式进化到抽象工厂模式,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。