设计模式(2.1/23) - 简单工厂模式

30 阅读3分钟

简单工厂模式

1 概述

  • 简单工厂模式不是一个正式的设计模式,但它是工厂模式的基础。
  • 简单工厂模式是一种创建对象的设计模式,它通过一个工厂类来决定实例化哪一个具体类的对象。这个模式的主要目的是将对象的创建与使用分离,从而提高代码的灵活性和可维护性。

2 优缺点及应用场景

2.1 优点

  • 1)封装对象创建:客户端不需要知道具体产品的类名,只需要知道工厂类提供的创建方法。
  • 2)易于扩展:新增产品时,只需在工厂类中添加相应的创建逻辑,无需修改客户端代码。

2.2 缺点

  • 1)违反开闭原则:添加新产品时需要修改工厂类,工厂类的修改会影响所有使用该工厂的客户端。
  • 2)类职责过重:工厂类集中了所有对象的创建逻辑,当产品种类增多时,工厂类会变得臃肿。

2.3 应用场景

  • 1)日志记录:日志可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志的位置。
  • 2)数据库访问:当用户不知道最终系统使用哪种数据库,或者数据库可能变化时。

3 结构

  • 1)工厂类(Factory):提供一个创建对象的方法,该方法根据传入的参数决定实例化哪一个具体类的对象。
  • 2)抽象产品类(Product):定义产品对象的接口。
  • 3)具体产品类(ConcreteProduct):实现抽象产品类接口的具体类。

4 实现

4.1 UML 类图

简单工厂模式.jpg

4.2 代码示例

  • 以下是一个简单工厂模式的代码示例,以创建不同类型的图形对象为例:
// 为形状创建一个接口
interface Shape {
  void draw();
}

// 创建实现接口的实体类:正方形
class Square implements Shape {
  @Override
  public void draw() {
    System.out.println("Inside Square::draw() method.");
  }
}

// 创建实现接口的实体类:长方形
class Rectangle implements Shape {
  @Override
  public void draw() {
    System.out.println("Inside Rectangle::draw() method.");
  }
}

// 创建实现接口的实体类:圆形
class Circle implements Shape {
  @Override
  public void draw() {
    System.out.println("Inside Circle::draw() method.");
  }
}

// 形状工厂类
class ShapeFactory {
  public static Shape createShape(String shapeType) {
    if (shapeType == null) {
      return null;
    }
    if (shapeType.equalsIgnoreCase("SQUARE")) {
      return new Square();
    } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
      return new Rectangle();
    } else if (shapeType.equalsIgnoreCase("CIRCLE")) {
      return new Circle();
    }
    return null;
  }
}

// 使用 ShapeFactory 来获取 Shape,通过传递类型信息来获取实体类的对象
public class SimpleFactoryPatternDemo {
  public static void main(String[] args) {
    // 通过形状工厂创建 Square 对象
    Shape shape1 = ShapeFactory.createShape("SQUARE");
    // 调用 Square 的 draw 方法
    shape1.draw();
    
    // 通过形状工厂创建 Rectangle 对象
    Shape shape2 = ShapeFactory.createShape("RECTANGLE");
    // 调用 Rectangle 的 draw 方法
    shape2.draw();

    // 通过形状工厂创建 Circle 对象
    Shape shape3 = ShapeFactory.createShape("CIRCLE");
    // 调用 Circle 的 draw 方法
    shape3.draw();
  }
}
  • 执行程序,输出结果:
Inside Square::draw() method.
Inside Rectangle::draw() method.
Inside Circle::draw() method.

5 总结

  • 简单工厂模式通过使用工厂类将对象的创建逻辑封装起来,客户端通过工厂类来创建对象。这种模式适用于产品种类较少且变化不频繁的情况。如果产品种类较多且变化频繁,可以考虑使用工厂方法模式或抽象工厂模式来更好地应对扩展性和维护性的问题。