1.1 定义
- 为创建一组相关或互相依赖的对象提供一个接口,并且无需指定他们的具体类。
- 抽象工厂模式是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
1.2 角色
- UML
- AbstractFactory :抽象工厂角色,它声明一组用于创建一种产品的方法,每一个方法对应一种产品,如上图中的 AbstractFactory 中就定义了两个方法,分别创建产品 A 和产品B。
- ConcreteFactory : 具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生成一组具体产品,这些产品构成了一个产品种类,每一个产品都位于某个产品等级结构中,如上述类图中的 ConcreteFactory1 、ConcreteFactory2。
- AbstractProduct: 抽象产品角色,它为每种产品声明接口,比如上述类图中的 AbstractProduct A, AbstractProduct B。
- ConcreteProduct: 具体产品角色,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法,如上图的 ConcreteProductA1 , ConcreteProductA2 , ConcreteProductB1 ,ConcreteProductB2.
1.3 代码
public class Demo {
public static void main(String[] args) {
// 定义工厂
AbstractFactoryA factoryA = new FactoryA();
// 生产产品
factoryA.getProductA().commonMethod();
factoryA.getProductA().uniqueMethod();
AbstractFactoryB factoryB = new FactoryB();
factoryB.getProductB().commonMethod();
factoryB.getProductB().uniqueMethod();
}
}
// 抽象产品类
abstract class AbstractProduct {
// 产品共有方法
public void commonMethod() {
System.out.println("common method");
}
// 产品特有方法
public abstract void uniqueMethod();
}
// 实现类A
class ProductA extends AbstractProduct {
@Override
public void uniqueMethod() {
System.out.println("product A");
}
}
// 实现类B
class ProductB extends AbstractProduct {
@Override
public void uniqueMethod() {
System.out.println("product B");
}
}
// 生产产品A 抽象工厂
abstract class AbstractFactoryA {
public abstract ProductA getProductA();
}
// 生产产品A 实现类
class FactoryA extends AbstractFactoryA {
@Override
public ProductA getProductA() {
return new ProductA();
}
}
abstract class AbstractFactoryB {
public abstract ProductB getProductB();
}
class FactoryB extends AbstractFactoryB {
@Override
public ProductB getProductB() {
return new ProductB();
}
}
1.4 特点
- 接口和实现分离,客户端面向接口编程,不用关心具体实现,从具体的产品实现中解耦
- 增加新的具体工厂和产品族方便,切换产品族方便
- 不易增加新的产品,如果要增加新的产品需要抽象工厂和所有具体工厂
1.5 应用场景
- 一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
- 在软件产品开发过程中,涉及不容操作的时候,都可以考虑使用抽象工厂模式。
- 例如一个应用,需要在三个不同平台上运行,可以通过抽象工厂模式屏蔽掉操作系统对应用的影响。
- 三个不同操作系统上的软件功能、应用逻辑、UI都应该是非常类似的,唯一不同的是调用不同的工厂方法,由不同的产品类去处理操作系统交互的信息。
来源:oschina
链接:https://my.oschina.net/jacksonmike/blog/4943217