设计模式-抽象工厂
意图
抽象工厂提供一个接口,用来创建相关的对象家族,而不是和工厂方法一样,创建一个对象。
抽象工厂
抽象工厂模式的各个角色:
- 抽象工厂角色(Factory),工厂方法模式的核心,是具体工厂角色必须实现的接口或者必须继承父类。在 Java 类中他是抽象类或者接口来实现的。
- 具体工厂角色(ConcreteFactory),这个是实现抽象工厂接口的具体工厂类。
- 抽象产品角色(Product):抽象工厂模式所创建对象的基类,也就是产品对象共同父类。
- 具体产品角色(ConcreteProduct),这个角色实现了抽象产品橘色所定义的接口。
抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象。抽象工厂模式用了工厂方法模式来创建单一对象。AbstractFactory 中的 createProductA() 和 createProductB() 都可让子类实现,这两个方法单独来看就是在创建一个对象。
Client 要通过 AbstaractFactoty 同时调用两个方法创建两个对象,这里的两个对象属于同一类。
类图
代码实现
产品抽象类
public class AbstractProductA { } public class AbstractProductB { }
产品聚类
public class ProductA1 extends AbstractProductA { } public class ProductA2 extends AbstractProductA { } public class ProductB1 extends AbstractProductB { } public class ProductB2 extends AbstractProductB { }
抽象工厂类
public abstract class AbstractFactory { abstract AbstractProductA createProductA(); abstract AbstractProductB createProductB(); }
抽象工厂具体实现
public class ConcreteFactory1 extends AbstractFactory { AbstractProductA createProductA() { return new ProductA1(); } AbstractProductB createProductB() { return new ProductB1(); } } public class ConcreteFactory2 extends AbstractFactory { AbstractProductA createProductA() { return new ProductA2(); } AbstractProductB createProductB() { return new ProductB2(); } }
客户端调用
public class Client { public static void main(String[] args) { AbstractFactory abstractFactory = new ConcreteFactory1(); AbstractProductA productA = abstractFactory.createProductA(); AbstractProductB productB = abstractFactory.createProductB(); // do something with productA and productB } }