抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它用于创建相关或相互依赖对象的一组,而无需指定其具体的类。这种模式特别适用于产品族的情况,即一组相互关联的产品对象。
存在四种角色:
角色1:抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
角色2:具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
角色3:抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
角色4:具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
优点包括:
1.具体产品在应用层代码隔离,无须关心创建细节。
2.将一个系列的产品族统一到一起创建。
主要缺点:
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
增加了系统的抽象性和理解难度。
示例:定义了两个产品接口ProductA和ProductB,以及它们的具体实现ConcreteProductA1和ConcreteProductB1。然后定义了一个工厂接口Factory和一个具体工厂ConcreteFactory,它负责创建产品对象。最后,在客户端代码中,我们通过工厂创建了产品对象并调用它们的方法
//抽象产品A
public interface ProductA {void useProductA();
}
// 具体产品A1
public class ConcreteProductA1 implements ProductA{@Overridepublic void useProductA() {System.out.println("使用产品A1");}
}
//抽象产品B
interface ProductB {void useProductB();
}
//具体产品B1
public class ConcreteProductB1 implements ProductB {@Overridepublic void useProductB() {System.out.println("使用产品B1");}
}
// 抽象工厂
public interface Factory {ProductA createProductA();ProductB createProductB();
}
// 具体工厂
public class ConcreateFactory implements Factory{@Overridepublic ProductA createProductA() {System.out.println("具体产品实例化A1");return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {System.out.println("具体产品实例化B1");return new ConcreteProductB1();}
}
// 客户端调用测试
public class Client {public static void main(String[] args) {//工厂实例化Factory factory = new ConcreateFactory();//工厂调用ProductA productA = factory.createProductA();ProductB productB = factory.createProductB();productA.useProductA();productB.useProductB();}
}