文章

设计模式解密:抽象工厂模式的终极指南(PHP/Go双实现)

一、什么是抽象工厂模式?

抽象工厂模式(Abstract Factory Pattern) 是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的接口,而无需指定具体的类。抽象工厂模式的核心思想是将对象的创建逻辑与使用逻辑分离,同时支持多个产品族的扩展。

核心特征:

  1. 产品族:一组相关或依赖的产品。

  2. 抽象工厂接口:定义创建产品族中每个产品的方法。

  3. 具体工厂:实现抽象工厂接口,创建具体的产品。

抽象工厂模式结构图


二、适用场景

  • ✅ 需要创建一组相关或依赖的对象

  • ✅ 需要支持多个产品族的扩展

  • ✅ 需要解耦客户端代码与具体类

  • ✅ 需要确保产品之间的兼容性


三、抽象工厂模式的组成

1. 抽象产品接口

定义产品的通用接口。

2. 具体产品

实现抽象产品接口的具体类。

3. 抽象工厂接口

定义创建产品族中每个产品的方法。

4. 具体工厂

实现抽象工厂接口,创建具体的产品。


四、PHP实现方案

1. 抽象产品接口

interface Button {
    public function render(): string;
}

interface Checkbox {
    public function render(): string;
}

2. 具体产品

class WindowsButton implements Button {
    public function render(): string {
        return "Render a button in Windows style";
    }
}

class WindowsCheckbox implements Checkbox {
    public function render(): string {
        return "Render a checkbox in Windows style";
    }
}

class MacButton implements Button {
    public function render(): string {
        return "Render a button in Mac style";
    }
}

class MacCheckbox implements Checkbox {
    public function render(): string {
        return "Render a checkbox in Mac style";
    }
}

3. 抽象工厂接口

interface GUIFactory {
    public function createButton(): Button;
    public function createCheckbox(): Checkbox;
}

4. 具体工厂

class WindowsFactory implements GUIFactory {
    public function createButton(): Button {
        return new WindowsButton();
    }

    public function createCheckbox(): Checkbox {
        return new WindowsCheckbox();
    }
}

class MacFactory implements GUIFactory {
    public function createButton(): Button {
        return new MacButton();
    }

    public function createCheckbox(): Checkbox {
        return new MacCheckbox();
    }
}

5. 使用示例

function renderUI(GUIFactory $factory) {
    $button = $factory->createButton();
    $checkbox = $factory->createCheckbox();
    echo $button->render() . "\n";
    echo $checkbox->render() . "\n";
}

// 使用示例
$factory = new MacFactory();
renderUI($factory);
// 输出:
// Render a button in Mac style
// Render a checkbox in Mac style

五、Go实现方案

1. 抽象产品接口

package main

import "fmt"

type Button interface {
    Render() string
}

type Checkbox interface {
    Render() string
}

2. 具体产品

type WindowsButton struct{}

func (b WindowsButton) Render() string {
    return "Render a button in Windows style"
}

type WindowsCheckbox struct{}

func (c WindowsCheckbox) Render() string {
    return "Render a checkbox in Windows style"
}

type MacButton struct{}

func (b MacButton) Render() string {
    return "Render a button in Mac style"
}

type MacCheckbox struct{}

func (c MacCheckbox) Render() string {
    return "Render a checkbox in Mac style"
}

3. 抽象工厂接口

type GUIFactory interface {
    CreateButton() Button
    CreateCheckbox() Checkbox
}

4. 具体工厂

type WindowsFactory struct{}

func (f WindowsFactory) CreateButton() Button {
    return WindowsButton{}
}

func (f WindowsFactory) CreateCheckbox() Checkbox {
    return WindowsCheckbox{}
}

type MacFactory struct{}

func (f MacFactory) CreateButton() Button {
    return MacButton{}
}

func (f MacFactory) CreateCheckbox() Checkbox {
    return MacCheckbox{}
}

5. 使用示例

func renderUI(factory GUIFactory) {
    button := factory.CreateButton()
    checkbox := factory.CreateCheckbox()
    fmt.Println(button.Render())
    fmt.Println(checkbox.Render())
}

func main() {
    factory := MacFactory{}
    renderUI(factory)
    // 输出:
    // Render a button in Mac style
    // Render a checkbox in Mac style
}

六、关键实现差异对比

特性

PHP

Go

接口定义

使用interface关键字

使用interface关键字

多态支持

通过接口实现

通过接口实现

错误处理

使用try-catch

使用error返回值

工厂方法

支持静态方法

不支持静态方法

依赖注入

可通过容器实现

需手动实现


七、模式优缺点分析

👍 优点:

  • 解耦创建逻辑:将对象的创建与使用分离。

  • 支持扩展:新增产品族时,无需修改客户端代码。

  • 确保兼容性:同一工厂创建的产品是兼容的。

👎 缺点:

  • 增加复杂度:引入额外的类和接口。

  • 过度设计:简单场景下可能显得冗余。


八、实际应用案例

1. 跨平台UI组件

  • 根据操作系统创建不同风格的UI组件。

2. 数据库访问层

  • 根据数据库类型创建连接、命令等对象。

3. 游戏角色装备

  • 根据角色职业创建武器、防具等装备。


九、总结

抽象工厂模式是解决复杂对象创建问题的经典设计模式。通过将对象的创建逻辑封装在工厂类中,我们可以实现代码的解耦、扩展和维护。无论是PHP还是Go,抽象工厂模式都能显著提升代码的灵活性和可读性。

在下一篇文章中,我们将深入探讨 建造者模式 及其在复杂对象构建中的应用。敬请期待!


下一篇预告:设计模式系列(四)——建造者模式:构建复杂对象的艺术

License:  CC BY 4.0