返回

重新认识设计模式:揭开工厂模式与抽象工厂模式的神秘面纱

Android

在软件开发错综复杂的道路上,设计模式犹如灯塔,指引着开发者在代码海洋中航行。工厂模式和抽象工厂模式便是两颗璀璨的明珠,帮助我们应对创建对象时的重重挑战。

工厂模式:创建对象的接口

工厂模式如同一个熟练的工匠,它定义了一个创建对象的接口,将具体对象的创建过程委托给其子类。这种模式的精髓在于解耦客户端与具体类的耦合,让客户端只需关注创建对象的通用接口,而无需了解具体对象的实现细节。

使用场景

工厂模式在以下场景中大显身手:

  • 当需要生成一组相关对象时,工厂模式可提供一个统一的创建接口,简化对象的创建过程。
  • 当需要动态创建对象时,工厂模式可根据不同的条件创建不同的实例,实现灵活的创建机制。
  • 当需要隔离客户端与具体类的实现细节时,工厂模式可作为一道屏障,保护客户端不受底层变化的影响。

代码实现

interface Product {
  void create();
}

class ProductA implements Product {
  @Override
  public void create() {
    System.out.println("Creating ProductA");
  }
}

class ProductB implements Product {
  @Override
  public void create() {
    System.out.println("Creating ProductB");
  }
}

class Factory {
  public Product createProduct(String type) {
    if (type.equals("A")) {
      return new ProductA();
    } else if (type.equals("B")) {
      return new ProductB();
    } else {
      throw new IllegalArgumentException("Invalid product type: " + type);
    }
  }
}

抽象工厂模式:创建相关对象的家族

抽象工厂模式进一步拓展了工厂模式的理念,它定义了一个用于创建相关对象家族的接口,让子类决定实例化哪个具体工厂,从而生成一组相关的对象。

使用场景

抽象工厂模式在以下场景中备受青睐:

  • 当需要创建相关对象家族时,抽象工厂模式可提供一个统一的创建接口,简化对象的创建过程。
  • 当需要根据不同平台或框架创建对象时,抽象工厂模式可隔离客户端与具体平台的实现细节,实现跨平台的可移植性。
  • 当需要保持对象家族的一致性时,抽象工厂模式可通过强制创建相关对象来确保对象之间的兼容性。

代码实现

interface AbstractFactory {
  ProductA createProductA();
  ProductB createProductB();
}

class ConcreteFactory1 implements AbstractFactory {
  @Override
  public ProductA createProductA() {
    return new ProductA1();
  }

  @Override
  public ProductB createProductB() {
    return new ProductB1();
  }
}

class ConcreteFactory2 implements AbstractFactory {
  @Override
  public ProductA createProductA() {
    return new ProductA2();
  }

  @Override
  public ProductB createProductB() {
    return new ProductB2();
  }
}

总结

工厂模式和抽象工厂模式是设计模式中不可或缺的利器,它们通过解耦对象创建过程,提升代码的灵活性和可重用性。通过合理运用这些模式,我们可以构建更优雅、更健壮的软件系统。