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

本文详细解析抽象工厂设计模式的应用场景与实现方式,通过Java代码示例展示如何创建产品族工厂管理器,实现产品创建的独立性与接口隐藏,适用于需要统一管理多系列产品的复杂系统设计。

抽象工厂模式

工厂一直是构建应用程序的关键模式,其简单性、有效性和针对性令人着迷。当开始学习面向设计的应用程序或API方法时,我总是推荐将工厂模式作为设计要点的关键入门说明。

今天我要讨论的是抽象工厂模式。它并不是你称之为模式的"抽象"类或对象,而是一个工厂的工厂,这正是使其在措辞上如此抽象的原因。“抽象"类的存在只是硬币的另一面。

何时使用抽象工厂:

  • 需要独立于产品的创建、组合或表示方式
  • 需要对作为组使用的产品实施可执行的约束
  • 需要仅展示产品的接口而不暴露其实现,作为更大图景的一部分

实现方案

这是我计划实现的方式:

包含关系:

  • 产品包含规格
  • 工厂包含产品
  • 工厂管理器包含工厂
  • 工厂管理器包含计算机工厂

继承关系:

  • 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
21
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 设计