抽象工厂模式(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{
@Override
public void useProductA() {
System.out.println("使用产品A1");
}
}
//抽象产品B
interface ProductB {
void useProductB();
}
//具体产品B1
public class ConcreteProductB1 implements ProductB {
@Override
public void useProductB() {
System.out.println("使用产品B1");
}
}
// 抽象工厂
public interface Factory {
ProductA createProductA();
ProductB createProductB();
}
// 具体工厂
public class ConcreateFactory implements Factory{
@Override
public ProductA createProductA() {
System.out.println("具体产品实例化A1");
return new ConcreteProductA1();
}
@Override
public 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();
}
}