抽象工厂模式


抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式是一种软件设计模式,它提供一种方法来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。这种模式属于创建型模式,在抽象工厂模式中,工厂类负责创建一系列相关的对象,而客户端可以通过调用工厂类的方法来获取这些对象,而不需要知道具体的实现。

实现

抽象工厂模式由以下四个部分组成:

  1. 抽象工厂(Abstract Factory):它声明了一组用于创建一些抽象产品的工厂方法,这些工厂方法可以被任意实现,从而实现具体工厂类所需的产品对象。
  2. 具体工厂(Concrete Factory):它实现了抽象工厂中定义的工厂方法,用于创建具体的产品对象。
  3. 抽象产品(Abstract Product):它声明了一组用于访问产品的接口,这些产品的接口可以被具体的产品所实现,从而实现不同产品对象之间的切换。
  4. 具体产品(Concrete Product):它实现了抽象产品中定义的接口,用于提供具体的产品功能。

在抽象工厂模式中,客户端通过调用工厂类的方法来获取产品对象,而不需要知道具体的实现。具体产品对象是在具体工厂类中创建的,客户端只需要知道适用于自己的抽象工厂类即可。

优缺点

抽象工厂模式主要优点是:

  1. 扩展性优良:抽象工厂模式通过增加新的工厂类和产品类来扩展系统功能,无需修改原有代码。
  2. 替换性优良:抽象工厂模式允许客户端使用抽象接口来创建一系列相关的产品对象,客户端无需关心具体的实现方式,从而在系统中更容易进行替换。
  3. 分离性优良:具体工厂类和具体产品类之间的耦合度较低,可以独立变化。

抽象工厂模式的主要缺点是:

  1. 系统的可扩展性受限:在新增产品类时,必须修改所有的抽象工厂类和所有的具体工厂类。

示例

假设我们有一个UIFactory接口,它有两个抽象方法createButton()createTextField(),分别用于创建按钮和文本框。我们有两个具体的实现类:WindowsUIFactoryMacUIFactory,它们分别能够创建Windows和Mac风格的按钮和文本框。

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

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

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

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

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

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

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

//具体产品:WindowsButton类
public class WindowsButton implements Button {
    @Override
    public void paint() {
        System.out.println("Rendering Windows button");
    }
}

//具体产品:WindowsTextField类
public class WindowsTextField implements TextField {
    @Override
    public void paint() {
        System.out.println("Rendering Windows text field");
    }
}

//具体产品:MacButton类
public class MacButton implements Button {
    @Override
    public void paint() {
        System.out.println("Rendering Mac button");
    }
}

//具体产品:MacTextField类
public class MacTextField implements TextField {
    @Override
    public void paint() {
        System.out.println("Rendering Mac text field");
    }
}

接下来,我们可以创建一个GUIApp类,它依赖UIFactory接口,并且能够根据当前使用的操作系统,选择相应的具体工厂类。

//主程序:GUIApp类
public class GUIApp {
    private UIFactory factory;

    public GUIApp() {
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("windows")) {
            factory = new WindowsUIFactory();
        } else if (os.contains("mac")) {
            factory = new MacUIFactory();
        }
    }

    public void run() {
        Button button = factory.createButton();
        TextField textField = factory.createTextField();
        button.paint();
        textField.paint();
    }

    public static void main(String[] args) {
        GUIApp app = new GUIApp();
        app.run();
    }
}

运行GUIApp类,可以看到它能够根据当前使用的操作系统,选择相应的具体工厂类,并创建相应的具体产品对象。

总结

抽象工厂模式提供了一种方法来创建一系列相关的对象,而无需指定它们具体的类。它将抽象工厂、具体工厂、抽象产品和具体产品划分成四个部分,并通过工厂类来创建具体产品对象。抽象工厂模式具有扩展性优良、替换性优良和分离性优良等优点,但可扩展性受限。实际应用中,我们可以根据不同的需求,组合不同的具体工厂和具体产品,来实现不同的功能需求。