抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,用于提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体实现类。
它通过将产品的创建委托给多个具体工厂类来实现。
在抽象工厂模式中,存在一个抽象工厂接口,该接口声明了一组用于创建不同类型产品(如产品族)的方法。
每个具体工厂类实现了抽象工厂接口,并负责创建特定类型的产品。这些产品通常属于同一产品族,具有共同的主题或关联性。
使用抽象工厂模式可以实现以下目标:
将客户端代码与具体产品类解耦,使其不依赖于特定的产品实现。
支持切换不同的产品族,只需替换对应的具体工厂类即可。
保持产品之间的一致性,确保创建的产品是相互关联且兼容的。
下面是抽象工厂模式的基本结构:
抽象工厂(AbstractFactory):声明创建不同类型产品的接口。
具体工厂(ConcreteFactory):实现抽象工厂接口,负责创建具体类型的产品。
抽象产品(AbstractProduct):声明产品共有的接口。
具体产品(ConcreteProduct):实现抽象产品接口,具体工厂创建的产品。
提供demo版代码更容易理解
/*** @author zhou* 抽象产品A*/
interface ProductA {void operationA();
}/*** @author zhou* 抽象产品B*/
interface ProductB {void operationB();
}/*** @author zhou* 具体产品A1*/
class ConcreteProductA1 implements ProductA {@Overridepublic void operationA() {System.out.println("具体产品A1的操作");}
}/*** @author zhou* 具体产品A2*/
class ConcreteProductA2 implements ProductA {@Overridepublic void operationA() {System.out.println("具体产品A2的操作");}
}/*** @author zhou* 具体产品B1*/
class ConcreteProductB1 implements ProductB {@Overridepublic void operationB() {System.out.println("具体产品B1的操作");}
}/*** @author zhou* 具体产品B2*/
class ConcreteProductB2 implements ProductB {@Overridepublic void operationB() {System.out.println("具体产品B2的操作");}
}/*** @author zhou* 抽象工厂*/
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}/*** @author zhou* 具体工厂1*/
class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}/*** @author zhou* 具体工厂2*/
class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}/*** @author zhou* 客户端使用*/
public class Client {public static void main(String[] args) {// 创建具体工厂1AbstractFactory factory1 = new ConcreteFactory1();// 通过具体工厂1创建产品A和产品BProductA productA1 = factory1.createProductA();ProductB productB1 = factory1.createProductB();// 调用产品A和产品B的操作方法productA1.operationA();productB1.operationB();// 创建具体工厂2AbstractFactory factory2 = new ConcreteFactory2();// 通过具体工厂2创建产品A和产品BProductA productA2 = factory2.createProductA();ProductB productB2 = factory2.createProductB();// 调用产品A和产品B的操作方法productA2.operationA();productB2.operationB();}
}
上述代码中,使用了抽象产品(ProductA和ProductB)以及具体产品(ConcreteProductA1、ConcreteProductA2、ConcreteProductB1、ConcreteProductB2)。
抽象工厂接口(AbstractFactory)定义了创建产品A和产品B的抽象方法。具体工厂(ConcreteFactory1、ConcreteFactory2)实现了抽象工厂接口,
并分别创建了具体产品A和具体产品B。
在客户端代码中,我们可以根据不同的具体工厂选择创建对应类型的产品,并调用其操作方法。输出结果将显示具体产品的操作。
总结:抽象工厂模式通过提供一个接口来创建一族相关或依赖对象,将产品的创建与客户端代码解耦,增加系统的灵活性和可扩展性。
它适用于需要创建多个相关产品系列的场景,并且这些产品系列具有共同的主题或关联性。