工厂模式的定义

在 Java 中,工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离。通过使用工厂模式,我们可以将对象的创建逻辑封装在一个工厂类中,使得代码更加灵活、可维护和可扩展。

工厂模式的类型及应用场景

1. 简单工厂模式

  • 定义:简单工厂模式又称为静态工厂方法模式,它定义了一个工厂类,该类包含一个静态方法,根据传入的参数来决定创建并返回哪种具体产品的实例。
  • 示例代码
// 定义产品接口
interface Shape {
    void draw();
}

// 具体产品类:圆形
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

// 具体产品类:矩形
class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制矩形");
    }
}

// 简单工厂类
class ShapeFactory {
    public static Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}

// 客户端代码
public class SimpleFactoryExample {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.getShape("CIRCLE");
        circle.draw();

        Shape rectangle = ShapeFactory.getShape("RECTANGLE");
        rectangle.draw();
    }
}
  • 应用场景
    • 当创建对象的逻辑比较简单,且创建对象的种类较少时,可以使用简单工厂模式。例如,在一个小型的图形绘制程序中,根据用户输入的图形类型创建相应的图形对象。
    • 当客户端只需要知道传入的参数,而不需要关心对象的创建过程时,简单工厂模式可以将对象的创建过程封装起来,提高代码的可维护性。

2. 工厂方法模式

  • 定义:工厂方法模式定义了一个创建对象的抽象方法,让子类决定实例化哪个具体产品类。工厂方法模式将对象的创建延迟到子类中进行,使得工厂类和具体产品类之间的耦合度降低。
  • 示例代码
// 定义产品接口
interface Shape {
    void draw();
}

// 具体产品类:圆形
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

// 具体产品类:矩形
class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制矩形");
    }
}

// 抽象工厂类
abstract class ShapeFactory {
    public abstract Shape createShape();
}

// 具体工厂类:圆形工厂
class CircleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

// 具体工厂类:矩形工厂
class RectangleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

// 客户端代码
public class FactoryMethodExample {
    public static void main(String[] args) {
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw();

        ShapeFactory rectangleFactory = new RectangleFactory();
        Shape rectangle = rectangleFactory.createShape();
        rectangle.draw();
    }
}
  • 应用场景
    • 当一个类不知道它所需要的对象的具体类时,可以使用工厂方法模式。例如,在一个游戏开发中,不同的关卡可能需要不同类型的敌人,每个关卡可以作为一个具体的工厂类,负责创建该关卡所需的敌人对象。
    • 当一个类希望由它的子类来指定创建对象的具体类时,工厂方法模式可以将对象的创建逻辑封装在子类中,使得代码更加灵活和可扩展。

3. 抽象工厂模式

  • 定义:抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式可以创建多个不同类型的产品,这些产品通常属于同一个产品族。
  • 示例代码
// 定义按钮接口
interface Button {
    void paint();
}

// 具体按钮类:Windows 按钮
class WindowsButton implements Button {
    @Override
    public void paint() {
        System.out.println("绘制 Windows 按钮");
    }
}

// 具体按钮类:Mac 按钮
class MacButton implements Button {
    @Override
    public void paint() {
        System.out.println("绘制 Mac 按钮");
    }
}

// 定义文本框接口
interface TextField {
    void render();
}

// 具体文本框类:Windows 文本框
class WindowsTextField implements TextField {
    @Override
    public void render() {
        System.out.println("绘制 Windows 文本框");
    }
}

// 具体文本框类:Mac 文本框
class MacTextField implements TextField {
    @Override
    public void render() {
        System.out.println("绘制 Mac 文本框");
    }
}

// 抽象工厂接口
interface GUIFactory {
    Button createButton();
    TextField createTextField();
}

// 具体工厂类:Windows 工厂
class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public TextField createTextField() {
        return new WindowsTextField();
    }
}

// 具体工厂类:Mac 工厂
class MacFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public TextField createTextField() {
        return new MacTextField();
    }
}

// 客户端代码
public class AbstractFactoryExample {
    public static void main(String[] args) {
        GUIFactory windowsFactory = new WindowsFactory();
        Button windowsButton = windowsFactory.createButton();
        TextField windowsTextField = windowsFactory.createTextField();
        windowsButton.paint();
        windowsTextField.render();

        GUIFactory macFactory = new MacFactory();
        Button macButton = macFactory.createButton();
        TextField macTextField = macFactory.createTextField();
        macButton.paint();
        macTextField.render();
    }
}
  • 应用场景
    • 当需要创建一组相关的产品对象,并且希望保证这些产品对象之间的兼容性时,可以使用抽象工厂模式。例如,在一个跨平台的图形用户界面(GUI)开发中,不同的操作系统(如 Windows、Mac)需要使用不同风格的按钮、文本框等组件,抽象工厂模式可以根据不同的操作系统创建相应的组件对象。
    • 当系统需要独立于产品的创建、组合和表示时,抽象工厂模式可以将产品的创建逻辑封装在工厂类中,使得系统更加灵活和可维护。