定义:
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
通用类图:
通用源码类图:
抽象产品A类:
public abstract class AbstractProductA { /**共有方法*/ public void shareMethod(){ } //每个产品有各自的实现 public abstract void doSomething(); }
产品A1实现类
public class ProductA1 extends AbstractProductA { @Override public void doSomething() { System.out.println("产品A1的实现方法"); } }
产品A2实现类:
public class ProductA2 extends AbstractProductA { @Override public void doSomething() { System.out.println("产品A2的实现方法"); } }
B与A类似,不在赘述
抽象工厂类:
public abstract class AbstractCreator { //创建A产品家族 public abstract AbstractProductA createProductA(); //创建B产品家族 public abstract AbstractProductB createProductB(); }
产品等级1的实现类:
public class Creator1 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); } }
产品等级2的实现类:
public class Creator2 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA2(); } @Override public AbstractProductB createProductB() { return new ProductB2(); } }
场景类:
public class Client { public static void main(String[] args) { //定义两个工厂 AbstractCreator creator1 = new Creator1(); AbstractCreator creator2 = new Creator2(); AbstractProductA a1 = creator1.createProductA(); AbstractProductA a2 = creator2.createProductA(); AbstractProductB b1 = creator1.createProductB(); AbstractProductB b2 = creator2.createProductB(); a1.doSomething(); a2.doSomething(); b1.doSomething(); b2.doSomething(); }
女娲造人,加上性别的区分,类图:
抽象工厂模式的优点:
(1)封装性,高层模块不关心具体实现,只关心接口。工厂类来负责具体的实现逻辑。
(2)产品族内的约束为非公开状态。
抽象工厂模式的缺点:
产品族扩展非常困难
使用场景:
一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
最佳实践:
抽象工厂模式是一个简单的模式,使用的场景非常多,大家在软件产品开发过程中,涉及不同操作系统的时候,都可以考虑使用抽象工厂模式。