深入解析抽象工厂模式:构建灵活可扩展的软件架构

本文详细讲解了抽象工厂设计模式的实现原理和应用场景,通过Java代码示例展示了如何创建产品族、管理工厂实例,并解释了该模式在解耦具体实现与客户端代码方面的优势。

Abstract Factory pattern

工厂模式一直是构建应用程序的关键模式,它简单、高效且直击要点。当开始学习面向设计的方法构建应用或API时,我总是推荐将工厂模式作为设计中的关键切入点。今天我要讨论的是抽象工厂模式。它并不是你称之为模式的"抽象"类或对象,而是工厂的工厂——这正是它被称为"抽象"的原因。“抽象"类的存在只是这个模式的另一个侧面。

何时使用抽象工厂模式

  1. 需要独立于产品的创建、组合和表现方式时
  2. 需要对作为组使用的产品实施强制约束时
  3. 需要仅暴露产品接口而不暴露其实现细节时

实现方案

以下是我的实现计划:

Has A关系

  • 产品(Product)拥有规格(Specification)
  • 工厂(Factory)拥有产品(Product)
  • 工厂管理器(FactoryManager)拥有工厂(Factory)
  • 工厂管理器(FactoryManager)拥有计算机工厂(ComputerFactory)

Is A关系

  • B工厂是计算机工厂
  • A工厂是计算机工厂
  • (图中未显示)产品A是产品
  • 产品B是产品

代码实现

基础抽象工厂类

1
2
3
4
5
public abstract class ComputerFactory {
    public abstract String getName();
    public abstract Product[] getProducts();
    public abstract Product getProduct(int ProductID);
}

具体工厂实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public class AFactory extends ComputerFactory {
    public String getName(){
        return "A";
    }

    public Product[] getProducts(){
        return null;
    }

    public Product getProduct(int productID){
        switch(productID){
            case 1:
                return new ProductA();
            case 2:
                return new ProductB();
            default:
                throw new IllegalArgumentException("Sorry you hit the wrong factory, we closed down in 1600 BC");
        }
    }
}

工厂常量定义

1
2
3
4
public interface FactoryConstants {
    public int A = 1;
    public int B = 2;
}

工厂管理器(单例实现)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FactoryManager{
    private static FactoryManager factoryManager = null;
    
    private FactoryManager(){}
    
    public static FactoryManager getInstance(){
        if(factoryManager != null){
            return factoryManager;
        }
        else return factoryManager = new FactoryManager();
    }

    public ComputerFactory getFactory(int factory) throws IllegalArgumentException{
        switch(factory){
            case FactoryConstants.A:
                return new IBMFactory();
            case FactoryConstants.B:
                return new SUNFactory();
            default:
                throw new IllegalArgumentException("Sorry you hit the wrong factory, we closed down in 1600 BC");
        } 
    }
}

测试主方法

1
2
3
4
5
public static void main(String args[]){
    System.out.println(FactoryManager.getInstance().getFactory(FactoryConstants.A).getName());
    System.out.println(FactoryManager.getInstance().getFactory(FactoryConstants.B).getName());
    System.out.println(FactoryManager.getInstance().getFactory(3).getName());
}

完整代码清单可在原文链接查看。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计