结合简单工厂和工厂方法模式:实现灵活的对象创建

前言

在软件开发过程中,创建对象的方式直接影响代码的灵活性和可维护性。设计模式提供了一种解决复杂问题的方法,其中简单工厂模式和工厂方法模式是两种常用的创建型模式。在这篇文章中,我们将结合这两种模式,通过一个实际案例,展示如何有效地创建和管理对象。

背景与问题描述

假设我们正在开发一个跨平台的应用程序,需要支持不同类型的组件(例如按钮和窗口),而且要根据不同的配置来决定使用哪种平台实现。我们希望通过相同的接口来使用它们,从而简化代码和提高灵活性。

问题

直接在客户端代码中使用 new 关键字来创建不同平台的组件会导致代码耦合度高,不易扩展。如果未来需要支持新的平台(例如 Linux),就必须修改客户端代码,这违反了开闭原则。

解决方案

我们可以结合使用简单工厂模式和工厂方法模式。通过简单工厂来选择具体的工厂类,然后由具体工厂类通过工厂方法创建具体的产品对象。

设计与实现

产品接口

首先,定义按钮和窗口的接口。

java 复制代码
// 按钮接口
public interface Button {
    void render();
    void onClick();
}

// 窗口接口
public interface Window {
    void render();
}

具体产品类

接下来,实现不同平台的具体产品类。

java 复制代码
// Windows 按钮
public class WindowsButton implements Button {
    public void render() {
        System.out.println("Render a button in Windows style.");
    }
    public void onClick() {
        System.out.println("Handle button click in Windows style.");
    }
}

// Mac 按钮
public class MacButton implements Button {
    public void render() {
        System.out.println("Render a button in macOS style.");
    }
    public void onClick() {
        System.out.println("Handle button click in macOS style.");
    }
}

// Windows 窗口
public class WindowsWindow implements Window {
    public void render() {
        System.out.println("Render a window in Windows style.");
    }
}

// Mac 窗口
public class MacWindow implements Window {
    public void render() {
        System.out.println("Render a window in macOS style.");
    }
}

抽象工厂类

定义创建按钮和窗口的抽象工厂类。

java 复制代码
// 抽象工厂类
public abstract class GUIFactory {
    public abstract Button createButton();
    public abstract Window createWindow();
}

具体工厂类

实现不同平台的具体工厂类。

java 复制代码
// Windows 工厂
public class WindowsFactory extends GUIFactory {
    public Button createButton() {
        return new WindowsButton();
    }
    public Window createWindow() {
        return new WindowsWindow();
    }
}

// Mac 工厂
public class MacFactory extends GUIFactory {
    public Button createButton() {
        return new MacButton();
    }
    public Window createWindow() {
        return new MacWindow();
    }
}

简单工厂类

使用简单工厂类来选择具体的工厂。

java 复制代码
public class GUIFactorySimpleFactory {
    public static GUIFactory getFactory(String osType) {
        if (osType.equalsIgnoreCase("Windows")) {
            return new WindowsFactory();
        } else if (osType.equalsIgnoreCase("Mac")) {
            return new MacFactory();
        } else {
            throw new IllegalArgumentException("Unknown OS type.");
        }
    }
}

客户端代码

在客户端代码中使用简单工厂选择具体工厂,然后通过工厂方法创建产品对象。

java 复制代码
public class Application {
    private Button button;
    private Window window;
    
    public Application(GUIFactory factory) {
        button = factory.createButton();
        window = factory.createWindow();
    }
    
    public void render() {
        button.render();
        window.render();
    }
    
    public static void main(String[] args) {
        // 选择操作系统类型
        String osType = "Windows"; // 这个可以根据配置文件或运行时参数来决定

        // 使用简单工厂获取具体工厂
        GUIFactory factory = GUIFactorySimpleFactory.getFactory(osType);

        // 使用工厂方法创建具体产品
        Application app = new Application(factory);
        app.render();
    }
}

总结

通过将简单工厂和工厂方法结合使用,我们可以实现更灵活和可扩展的对象创建方式。在这个例子中,简单工厂用于选择具体的工厂,而具体工厂通过工厂方法来创建产品对象。这种组合方式不仅降低了客户端代码与具体类之间的耦合度,还使得系统更易于扩展和维护。

希望这个例子能帮助你更好地理解简单工厂和工厂方法的结合使用。如果你觉得这篇文章对你有帮助,请给我点个关注和赞!谢谢!

相关推荐
思忖小下3 天前
梳理你的思路(从OOP到架构设计)_设计模式Factory Method模式
设计模式·工厂方法模式·eit
霁月风3 天前
设计模式——工厂方法模式
c++·设计模式·工厂方法模式
huaqianzkh10 天前
简单工厂、工厂方法、抽象工厂的区别
java·设计模式·工厂方法模式
西岭千秋雪_13 天前
设计模式の单例&工厂&原型模式
java·单例模式·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式·原型模式
huaqianzkh22 天前
工厂方法模式的理解和实践
java·设计模式·工厂方法模式
暮雨c22 天前
重学设计模式-工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
设计模式·简单工厂模式·工厂方法模式
morning_judger24 天前
【设计模式系列】工厂方法模式(二十一)
java·设计模式·工厂方法模式
Theodore_102224 天前
12 设计模式之工厂方法模式
java·开发语言·算法·设计模式·简单工厂模式·工厂方法模式
重生之绝世牛码1 个月前
Java设计模式 —— 【创建型模式】工厂模式(简单工厂、工厂方法模式、抽象工厂)详解
java·大数据·开发语言·设计模式·工厂方法模式·设计原则·工厂模式
何朴尧1 个月前
工厂方法模式与抽象工厂模式
c++·工厂方法模式·抽象工厂模式