【设计模式】工厂模式

目录

什么是工厂模式

工厂模式变体

工厂模式优缺点

优点

缺点

简单工厂模式的实现

代码实现

工厂模式方法的实现

代码实现

抽象工厂模式的实现

代码实现


什么是工厂模式

        工厂模式是一种设计模式,用于创建对象的过程与对象使用者解耦,从而提高代码的灵活性和可维护性。在工厂模式中,将对象的创建过程封装在一个工厂类中,使用者不需要直接实例化对象,而是通过工厂类来获取所需的对象实例。

        简单来说就是,封装工厂类,工厂类获取实例。

工厂模式变体

  1. 简单工厂模式(Simple Factory Pattern): 简单工厂模式由一个工厂类负责创建所有对象实例,使用者通过调用工厂类的静态方法来获取对象实例。这种模式简单易懂,但违背了开放-封闭原则,因为每次新增一个产品都需要修改工厂类。

  2. 工厂方法模式(Factory Method Pattern): 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。这样可以将实例化的过程延迟到子类中,符合开放-封闭原则,但需要为每个具体产品定义一个工厂类。

  3. 抽象工厂模式(Abstract Factory Pattern): 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。它将一组具有相似主题的工厂封装起来,对于增加新的产品族很方便,但是难以增加新的产品等级结构。

工厂模式优缺点

优点

  • 降低耦合性: 使用者只需要知道工厂类及其接口,无需关心具体的产品实现,降低了对象之间的耦合性。
  • 提高可维护性: 当需要更改产品类时,只需修改工厂类的代码,而不需要修改使用者的代码。
  • 增加扩展性: 可以根据需求轻松添加新的产品类,而无需更改现有代码。

    缺点

    • 增加了类的数量: 引入了额外的工厂类,可能会增加类的数量,使得代码结构变得复杂。
    • 增加了系统的抽象性和理解难度: 对于初学者来说,理解工厂模式的思想和实现可能会比较困难,特别是在涉及多层次的抽象工厂时。

      简单工厂模式的实现

      代码实现

      /**
       * @description:
       * @author: 黎剑
       * @create: 2024-04-16 22:32
       **/
      // 定义产品接口
      interface Product {
          void operation();
      }
      // 具体产品类A
      class ConcreteProductA implements Product {
          @Override
          public void operation() {
              System.out.println("具体产品A的操作");
          }
      }
      // 具体产品类B
      class ConcreteProductB implements Product {
          @Override
          public void operation() {
              System.out.println("具体产品B的操作");
          }
      }
      // 简单工厂类
      class SimpleFactory {
          // 根据参数创建对应的产品实例
          public static Product createProduct(String type) {
              if ("A".equals(type)) {
                  return new ConcreteProductA();
              } else if ("B".equals(type)) {
                  return new ConcreteProductB();
              } else {
                  throw new IllegalArgumentException("Unsupported product type: " + type);
              }
          }
      }
      // 客户端代码
      public class Client {
          public static void main(String[] args) {
              // 使用工厂类创建产品实例
              Product productA = SimpleFactory.createProduct("A");
              Product productB = SimpleFactory.createProduct("B");
              // 调用产品实例的操作方法
              productA.operation();
              productB.operation();
          }
      }

              在这个示例中,Product 是一个产品接口,定义了产品的操作方法。ConcreteProductA 和 ConcreteProductB 是具体的产品类,实现了 Product 接口。

      SimpleFactory 是工厂类,负责根据传入的参数来创建具体的产品实例。在 Client 类中,通过调用工厂类的 createProduct 方法来获取所需的产品实例,并调用产品实例的操作方法。

      这样,客户端代码与具体产品类之间解耦,客户端只需要与工厂类打交道,可以根据需要轻松切换不同的产品类型。

      工厂模式方法的实现

              工厂方法模式的核心思想是定义一个抽象的工厂类,该工厂类包含一个抽象方法,用于创建产品对象。具体的产品类需要实现这个抽象方法,以创建具体的产品实例。

      工厂方法模式通常包括以下角色:

      1. 抽象产品(Abstract Product): 定义了产品的接口,描述了产品的特性和行为。

      2. 具体产品(Concrete Product): 实现了抽象产品接口,定义了具体产品的具体行为。

      3. 抽象工厂(Abstract Factory): 定义了一个抽象方法,用于创建产品对象,客户端通过调用这个方法来获取产品对象。

      4. 具体工厂(Concrete Factory): 实现了抽象工厂接口,负责创建具体的产品对象。

      代码实现

      /**
       * @description:
       * @author: 黎剑
       * @create: 2024-04-16 22:32
       **/
      // 定义抽象产品接口
      interface Product {
          void operation();
      }
      // 具体产品类A
      class ConcreteProductA implements Product {
          @Override
          public void operation() {
              System.out.println("具体产品A的操作");
          }
      }
      // 具体产品类B
      class ConcreteProductB implements Product {
          @Override
          public void operation() {
              System.out.println("具体产品B的操作");
          }
      }
      // 抽象工厂接口
      interface Factory {
          Product createProduct();
      }
      // 具体工厂类A
      class ConcreteFactoryA implements Factory {
          @Override
          public Product createProduct() {
              return new ConcreteProductA();
          }
      }
      // 具体工厂类B
      class ConcreteFactoryB implements Factory {
          @Override
          public Product createProduct() {
              return new ConcreteProductB();
          }
      }
      // 客户端代码
      public class Client {
          public static void main(String[] args) {
              // 创建具体工厂实例
              Factory factoryA = new ConcreteFactoryA();
              Factory factoryB = new ConcreteFactoryB();
              // 使用具体工厂创建产品实例
              Product productA = factoryA.createProduct();
              Product productB = factoryB.createProduct();
              // 调用产品实例的操作方法
              productA.operation();
              productB.operation();
          }
      }
      

      在这个示例中,Product 是抽象产品接口,定义了产品的操作方法。ConcreteProductA 和 ConcreteProductB 是具体的产品类,分别实现了 Product 接口。

      Factory 是抽象工厂接口,定义了一个抽象方法 createProduct(),用于创建产品实例。ConcreteFactoryA 和 ConcreteFactoryB 是具体的工厂类,分别实现了 Factory 接口,并实现了 createProduct() 方法以创建具体的产品实例。

      在客户端代码 Client 中,通过创建具体工厂实例,并调用其 createProduct() 方法来获取产品实例,然后调用产品实例的操作方法。

      这样,客户端代码与具体产品类之间解耦,客户端只需要与抽象工厂打交道,可以根据需要轻松切换不同的具体工厂和产品类型。

      抽象工厂模式的实现

              抽象工厂模式的主要目的是提供一个接口,用于创建相关对象的家族,而不需要指定具体的类。

      在抽象工厂模式中,有两个关键的抽象概念:

      1. 抽象产品(Abstract Product): 定义了一系列产品的接口,描述了产品的特性和行为。

      2. 抽象工厂(Abstract Factory): 定义了一个用于创建一系列产品的接口,包括创建产品的方法。

      抽象工厂模式通常包括以下角色:

      1. 抽象产品接口(Abstract Product): 定义了一系列产品的接口,描述了产品的特性和行为。

      2. 具体产品类(Concrete Product): 实现了抽象产品接口,定义了具体产品的具体行为。

      3. 抽象工厂接口(Abstract Factory): 定义了一个用于创建一系列产品的接口,包括创建产品的方法。

      4. 具体工厂类(Concrete Factory): 实现了抽象工厂接口,负责创建一系列相关的产品。

      抽象工厂模式的核心思想是提供一个接口,用于创建一系列相关的产品对象,而不需要指定具体的类。客户端通过调用抽象工厂的方法来获取产品对象,从而实现了客户端代码与具体产品类之间的解耦。

      代码实现

      // 定义抽象产品接口A
      interface AbstractProductA {
          void operationA();
      }
      // 具体产品类A1
      class ConcreteProductA1 implements AbstractProductA {
          @Override
          public void operationA() {
              System.out.println("具体产品A1的操作");
          }
      }
      // 具体产品类A2
      class ConcreteProductA2 implements AbstractProductA {
          @Override
          public void operationA() {
              System.out.println("具体产品A2的操作");
          }
      }
      // 定义抽象产品接口B
      interface AbstractProductB {
          void operationB();
      }
      // 具体产品类B1
      class ConcreteProductB1 implements AbstractProductB {
          @Override
          public void operationB() {
              System.out.println("具体产品B1的操作");
          }
      }
      // 具体产品类B2
      class ConcreteProductB2 implements AbstractProductB {
          @Override
          public void operationB() {
              System.out.println("具体产品B2的操作");
          }
      }
      // 定义抽象工厂接口
      interface AbstractFactory {
          AbstractProductA createProductA();
          AbstractProductB createProductB();
      }
      // 具体工厂类1
      class ConcreteFactory1 implements AbstractFactory {
          @Override
          public AbstractProductA createProductA() {
              return new ConcreteProductA1();
          }
          @Override
          public AbstractProductB createProductB() {
              return new ConcreteProductB1();
          }
      }
      // 具体工厂类2
      class ConcreteFactory2 implements AbstractFactory {
          @Override
          public AbstractProductA createProductA() {
              return new ConcreteProductA2();
          }
          @Override
          public AbstractProductB createProductB() {
              return new ConcreteProductB2();
          }
      }
      // 客户端代码
      public class Client {
          public static void main(String[] args) {
              // 创建具体工厂实例
              AbstractFactory factory1 = new ConcreteFactory1();
              AbstractFactory factory2 = new ConcreteFactory2();
              // 使用具体工厂创建产品实例
              AbstractProductA productA1 = factory1.createProductA();
              AbstractProductB productB1 = factory1.createProductB();
              AbstractProductA productA2 = factory2.createProductA();
              AbstractProductB productB2 = factory2.createProductB();
              // 调用产品实例的操作方法
              productA1.operationA();
              productB1.operationB();
              productA2.operationA();
              productB2.operationB();
          }
      }

      在这个示例中,AbstractProductA 和 AbstractProductB 是抽象产品接口,定义了产品的操作方法。ConcreteProductA1、ConcreteProductA2、ConcreteProductB1 和 ConcreteProductB2 是具体的产品类,分别实现了 AbstractProductA 和 AbstractProductB 接口。

      AbstractFactory 是抽象工厂接口,定义了创建一系列产品的方法。ConcreteFactory1 和 ConcreteFactory2 是具体的工厂类,分别实现了 AbstractFactory 接口,并实现了 createProductA() 和 createProductB() 方法以创建具体的产品实例。

      在客户端代码 Client 中,通过创建具体工厂实例,并调用其 createProductA() 和 createProductB() 方法来获取产品实例,然后调用产品实例的操作方法。

      这样,客户端代码与具体产品类之间解耦,客户端只需要与抽象工厂打交道,可以根据需要轻松切换不同的具体工厂和产品类型。