# 简单工厂模式

# 概念

由一个工厂类根据传入的参数,决定创建哪一种产品类的实例

# 结构

简单工厂模式包含三个部分:

  • 抽象产品:定义所有产品的共同接口或抽象类
  • 具体产品:实现抽象产品的具体类
  • 工厂类:提供一个静态方法,根据传入的参数决定创建哪种具体产品

# 例子

// 抽象产品
interface Shape {
    void draw();
}

// 具体产品 - 圆形
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个圆形");
    }
}

// 具体产品 - 方形
class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个方形");
    }
}

// 具体产品 - 三角形
class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个三角形");
    }
}

// 工厂类
class ShapeFactory {
    // 简单工厂的核心方法
    public static Shape createShape(String type) {
        if ("circle".equalsIgnoreCase(type)) {
            return new Circle();
        } else if ("square".equalsIgnoreCase(type)) {
            return new Square();
        } else if ("triangle".equalsIgnoreCase(type)) {
            return new Triangle();
        }
        return null;
    }
}

// 客户端
public class SimpleFactoryDemo {
    public static void main(String[] args) {
        Shape shape1 = ShapeFactory.createShape("circle");
        shape1.draw();

        Shape shape2 = ShapeFactory.createShape("square");
        shape2.draw();

        Shape shape3 = ShapeFactory.createShape("triangle");
        shape3.draw();
    }
}

# 优点

  • 通过工厂封装了对象创建过程,客户端不用关心具体类名。
  • 实例化对象集中管理,便于维护。

# 缺点

  • 不符合开闭原则:如果新增产品(比如 Rectangle),必须修改工厂类代码。
  • 工厂类职责过重,所有对象的创建都要依赖它,容易变得复杂。

# 使用场景

  • 需要创建的对象较少。
  • 客户端不想关心具体对象的创建过程。比如:日志类、图形类、数据库连接等场景。

# 注意

  • 简单工厂模式不满足开闭原则。简单工厂模式使用if-else或switch语句来判断创建哪种产品对象,当需要增加新产品时,必须修改工厂类的代码,这违反了开闭原则。
  • 在JDBC中使用Class.forName()加载驱动类是工厂模式的典型应用。这里使用了反射机制来创建Driver实例,具体的驱动实现对用户是透明的,这正是工厂模式"封装对象创建过程"的体现。