Abstract Factory(抽象工厂)
特点
抽象工厂提供了一个创建一系列相关或相互依赖的接口,且无须指定它们具体的类。
大概结构
按照理解,自己在processOn里画了一个大概的结构,大家凑合的看。
其中
- AbstractFactory 声明一个抽象对象的操作接口
- ConcreteFactory 实现具体对象的操作
- AbstractProduct 为一类对象声明接口
- ConcreteProduct 定义一个相对应的产品对象,内部实现AbstractProduct
- Client 仅使用由AbstractFactory 和 AbstractProduct 类声明的接口
与工厂方法相比,其实就在产品的抽象上多抽一个产品B,工厂接口中多定义个方法。
代码
按照结构图,创建Factory接口类,声明两个产品的接口方法。
interface Factory { ProductA createProductA(); ProductB createProductB(); }
实现类Factory上,创建FactoryA和FactoryB来实现createProduct方法,返回对应的类。
class FactoryA implements Factory{ @Override public ProductA createProductA(){ return new ProductA1(); } @Override public ProductB createProductB(){ return new ProductB1(); } } class FactoryB implements Factory{ @Override public ProductA createProductA(){ return new ProductA2(); } @Override public ProductB createProductB(){ return new ProductB2(); } }
声明两种产品的接口类ProductA 和ProductB
interface ProductA { void method(); } interface ProductB { void method(); }
以及对应的实现类
class ProductA1 implements ProductA{ @Override public void method() { System.out.println("产品A1"); } } class ProductA2 implements ProductA{ @Override public void method() { System.out.println("产品A2"); } } class ProductB1 implements ProductB{ @Override public void method() { System.out.println("产品B1"); } } class ProductB2 implements ProductB{ @Override public void method() { System.out.println("产品B2"); } }
Client作为Main函数进行创建工厂对象并创建类
public static void main(String[] args) { Factory factoryA = new FactoryA(); ProductA productA = factoryA.createProductA(); //打印 产品A1 productA.method(); Factory factoryB = new FactoryB(); ProductB productB = factoryB.createProductB(); //打印 产品B2 productB.method(); }
适用性
它适用于
- 独立于产品的创建,表示和组合时。
- 由多个产品中的一个来配置时。
- 提供一个产品库,仅显示接口而不是实现时。
结束
抽象工厂的每个方法看起来都像是工厂方法,且每个方法都被声明成抽象,由子类的方法进行覆盖和实现。
希望本文能对大家有所帮助,和了不起一起持续学习。