之前已经写过工厂方法模式,其可以将创建对象的代码集中在一个对象或方法中,当增加产品时,只需要增加对应的产品和工厂类即可。但是其有一个问题是工厂的接口里只有一个创建抽象产品的方法,当我们想要在一个工厂里创建一系列的产品时,就需要使用抽象工厂模式。
使用
图看起来可能有点容易乱,其实主要有三个接口,两个产品的接口,每个产品接口有多个实现类
同时有一个工厂类,工厂类中可以生成每种产品接口的一个实现类。
代码(Java)
产品组部分的代码如下:
// A产品接口 public interface ProductA { void method(); } // A产品实现类A1 public class ProductA1 implements ProductA { @Override public void method() { System.out.println("This is ProductA1"); } } // A产品实现类A2 public class ProductA2 implements ProductA { @Override public void method() { System.out.println("This is ProductA2"); } } // B产品接口 public interface ProductB { void method(); } // B产品实现类B1 public class ProductB1 implements ProductB { @Override public void method() { System.out.println("This is productB1"); } } // B产品实现类B2 public class ProductB2 implements ProductB { @Override public void method() { System.out.println("This is productB2"); } }
工厂相关代码:
// 抽象工厂接口 public interface Factory { // 生成A类产品 ProductA createProductA(); // 生成B类产品 ProductB createProductB(); } // 抽象工厂实现类1,生产ProductA1和ProductB1 public class ConcreteFactory1 implements Factory { @Override public ProductA createProductA() { return new ProductA1(); } @Override public ProductB createProductB() { return new ProductB1(); } } // 抽象工厂实现类2,生产ProductA2和ProductB2 public class ConcreteFactory2 implements Factory { @Override public ProductA createProductA() { return new ProductA2(); } @Override public ProductB createProductB() { return new ProductB2(); } }
测试类如下:
public class Test { public static void main(String[] args) { Factory factory = new ConcreteFactory1(); // 使用具体工厂1 ProductA productA = factory.createProductA(); ProductB productB = factory.createProductB(); productA.method(); // 输出:This is ProductA1 productB.method(); // 输出:This is productB1 factory = new ConcreteFactory2(); // 切换工厂,使用具体工厂2 productA = factory.createProductA(); productB = factory.createProductB(); productA.method(); // 输出:This is ProductA2 productB.method(); // 输出:This is productB2 } }
总结
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
有一个工厂抽象类或接口,多种产品抽象类或接口,每个具体工厂子类可以创建多种产品类。