工厂模式深度解析:工厂方法 vs 抽象工厂

1. 核心概念对比

1.1 工厂方法模式(Factory Method)

工厂方法模式定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

关键结论:工厂方法是"单个产品等级结构"的创建解决方案,通过子类化实现具体创建逻辑

1.2 抽象工厂模式(Abstract Factory)

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

关键结论:抽象工厂是"多个产品等级结构"的创建解决方案,强调产品族的概念

2. 代码实现对比

2.1 工厂方法实现

Java实现
// 产品接口
interface Button {
    void render();
}

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

class MacOSButton implements Button {
    @Override
    public void render() {
        System.out.println("Rendering a MacOS style button");
    }
}

// 创建者抽象类
abstract class Dialog {
    // 工厂方法
    abstract Button createButton();
    
    void render() {
        Button button = createButton();
        button.render();
    }
}

// 具体创建者
class WindowsDialog extends Dialog {
    @Override
    Button createButton() {
        return new WindowsButton();
    }
}

class MacOSDialog extends Dialog {
    @Override
    Button createButton() {
        return new MacOSButton();
    }
}

// 使用
public class FactoryMethodDemo {
    public static void main(String[] args) {
        Dialog dialog = System.getProperty("os.name").contains("Mac") 
            ? new MacOSDialog() 
            : new WindowsDialog();
        dialog.render();
    }
}
Python实现
from abc import ABC, abstractmethod

# 产品接口
class Button(ABC):
    @abstractmethod
    def render(self):
        pass

# 具体产品
class WindowsButton(Button):
    def render(self):
        print("Rendering a Windows style button")

class MacOSButton(Button):
    def render(self):
        print("Rendering a MacOS style button")

# 创建者抽象类
class Dialog(ABC):
    @abstractmethod
    def create_button(self) -> Button:
        pass
    
    def render(self):
        button = self.create_button()
        button.render()

# 具体创建者
class WindowsDialog(Dialog):
    def create_button(self) -> Button:
        return WindowsButton()

class MacOSDialog(Dialog):
    def create_button(self) -> Button:
        return MacOSButton()

# 使用
if __name__ == "__main__":
    import sys
    dialog = MacOSDialog() if sys.platfo

你可能感兴趣的:(设计模式)