[设计模式] 抽象工厂模式简易案例

定义:提供一个接口来创建一系列相关或依赖对象,而无需指定其具体类。

痛点:当需要创建一组相关对象,例如操作系统的不同界面组件(按钮、文本框等)时,抽象工厂模式非常有用。

以下是一个简单的抽象工厂模式的 Java 示例,假设你要创建不同类型的按钮和窗口组件。

首先,定义抽象按钮类 Button 和抽象窗口类 Window:

java 复制代码
// 抽象按钮类
public abstract class Button {
    public abstract void paint();
}

// 抽象窗口类
public abstract class Window {
    public abstract void render();
}

然后,创建具体的按钮类 LinuxButton 和 WindowsButton,以及具体的窗口类 LinuxWindow 和 WindowsWindow:

java 复制代码
// 具体的 Linux 按钮类
public class LinuxButton extends Button {
    @Override
    public void paint() {
        System.out.println("Linux 按钮");
    }
}

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

// 具体的 Linux 窗口类
public class LinuxWindow extends Window {
    @Override
    public void render() {
        System.out.println("Linux 窗口");
    }
}

// 具体的 Windows 窗口类
public class WindowsWindow extends Window {
    @Override
    public void render() {
        System.out.println("Windows 窗口");
    }
}

接下来,定义抽象工厂类 UIFactory,它包含创建按钮和窗口的抽象方法:

java 复制代码
public abstract class UIFactory {
    public abstract Button createButton();
    public abstract Window createWindow();
}

创建具体的工厂类 LinuxUIFactory 和 WindowsUIFactory,分别用于创建 Linux 风格和 Windows 风格的按钮和窗口组件:

java 复制代码
// 具体的 Linux UI 工厂
public class LinuxUIFactory extends UIFactory {
    @Override
    public Button createButton() {
        return new LinuxButton();
    }

    @Override
    public Window createWindow() {
        return new LinuxWindow();
    }
}

// 具体的 Windows UI 工厂
public class WindowsUIFactory extends UIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public Window createWindow() {
        return new WindowsWindow();
    }
}

最后,你可以使用抽象工厂模式来创建不同风格的按钮和窗口组件:

java 复制代码
public class Main {
    public static void main(String[] args) {
        // 创建 Linux 风格的 UI 组件
        UIFactory linuxFactory = new LinuxUIFactory();
        Button linuxButton = linuxFactory.createButton();
        Window linuxWindow = linuxFactory.createWindow();

        linuxButton.paint(); // 输出:Linux 按钮
        linuxWindow.render(); // 输出:Linux 窗口

        // 创建 Windows 风格的 UI 组件
        UIFactory windowsFactory = new WindowsUIFactory();
        Button windowsButton = windowsFactory.createButton();
        Window windowsWindow = windowsFactory.createWindow();

        windowsButton.paint(); // 输出:Windows 按钮
        windowsWindow.render(); // 输出:Windows 窗口
    }
}

这个示例演示了抽象工厂模式的用法,根据不同的工厂对象创建了不同风格的按钮和窗口组件,而不需要关心它们的具体实现类。这种方式有助于创建一组相关或依赖的对象,同时保持代码的灵活性和可维护性。

相关推荐
七月丶2 天前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞2 天前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼2 天前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟2 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder2 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室3 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦3 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo7 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4967 天前
js设计模式 --- 工厂模式
设计模式