工厂模式

74 阅读3分钟

工厂模式(Factory Pattern)是面向对象编程中的一种创建型设计模式,它提供了一种创建对象的最佳方式。通过工厂模式,我们可以将对象的创建和使用分离,使得代码更加符合开闭原则(对扩展开放,对修改关闭)。工厂模式主要有三种形式:

  1. 简单工厂模式(Simple Factory)
  2. 工厂方法模式(Factory Method)
  3. 抽象工厂模式(Abstract Factory)

简单工厂模式

简单工厂模式不是GoF定义的23种设计模式之一,但它是理解和实现其他两种工厂模式的基础。在这个模式中,存在一个单独的类负责创建其他类的实例。这个负责创建实例的类通常被称为“工厂”。

示例

假设我们有一个Shape接口,以及实现了该接口的多个形状类,如CircleRectangle等。

// 定义一个Shape接口
public interface Shape {
    void draw();
}

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

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

// 简单工厂类
public class ShapeFactory {
    // 使用 getShape 方法获取形状类型的对象
    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;
    }
}

工厂方法模式

工厂方法模式定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。这种模式把实例化的责任推迟到子类。

示例

在工厂方法模式中,我们将上面的例子中的ShapeFactory改为一个抽象类,并为每个具体产品提供具体的工厂类。

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

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

public class RectangleFactory extends AbstractShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

抽象工厂模式

抽象工厂模式提供了一组相关的或依赖的对象而不需要指定它们具体的类。它主要用于一组有关系的产品族的创建。

示例

考虑我们需要创建一套图形界面组件,包括按钮和文本框,这些组件有两种风格:Windows风格和Mac风格。

// 抽象产品接口
public interface Button {
    void paint();
}

public interface TextBox {
    void paint();
}

// 具体产品
public class WindowsButton implements Button {
    @Override
    public void paint() {
        System.out.println("You have created WindowsButton.");
    }
}

public class WindowsTextBox implements TextBox {
    @Override
    public void paint() {
        System.out.println("You have created WindowsTextBox.");
    }
}

public class MacButton implements Button {
    @Override
    public void paint() {
        System.out.println("You have created MacButton.");
    }
}

public class MacTextBox implements TextBox {
    @Override
    public void paint() {
        System.out.println("You have created MacTextBox.");
    }
}

// 抽象工厂
public interface GUIFactory {
    Button createButton();
    TextBox createTextBox();
}

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

    @Override
    public TextBox createTextBox() {
        return new WindowsTextBox();
    }
}

public class MacFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public TextBox createTextBox() {
        return new MacTextBox();
    }
}

工厂模式的应用场景

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当需要创建的对象是一系列相关或相互依赖的对象时。
  • 需要避免客户端直接耦合于具体产品类时。

结语

希望这篇文章能够帮助您更好地理解工厂模式,并为您提供一些实用的编码技巧。如果您有任何疑问或者建议,请随时留言讨论。