Skip to content

抽象工厂

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

适合的场景

普通工厂模式适合创建单个产品,但有时候我们需要多个产品协同工作,比如:

  • 一个UI系统:按钮、窗口、文本框都要统一风格

  • 一个游戏阵营:精灵族的士兵、法师、建筑都是一套;兽人族又是另一套

  • 一个关卡元素:背景、敌人、掉落物都成套变化

这时候,如果你还靠普通工厂一个个new,那就太笨重了!

抽象工厂让你一口气整套创建,并且切换起来超丝滑

它强调的是多个相关产品的成套创建,比普通工厂更高级也更复杂些。 但一旦用起来,维护和扩展都很舒服,不容易出错。

基本结构

  1. 抽象产品族接口(多个产品接口)

  2. 具体产品族实现(多个产品的实现)

  3. 抽象工厂接口(包含一组产品的创建方法)

  4. 具体工厂实现(对应的产品族)

示例

csharp
// 抽象产品
public interface IButton { void Click(); }
public interface IWindow { void Open(); }

// 具体产品:Windows风格
public class WinButton : IButton { public void Click() => Console.WriteLine("点击了Windows按钮"); }
public class WinWindow : IWindow { public void Open() => Console.WriteLine("打开了Windows窗口"); }

// 具体产品:Mac风格
public class MacButton : IButton { public void Click() => Console.WriteLine("点击了Mac按钮"); }
public class MacWindow : IWindow { public void Open() => Console.WriteLine("打开了Mac窗口"); }

// 抽象工厂
public interface IGUIFactory
{
    IButton CreateButton();
    IWindow CreateWindow();
}

// 具体工厂
public class WindowsFactory : IGUIFactory
{
    public IButton CreateButton() => new WinButton();
    public IWindow CreateWindow() => new WinWindow();
}

public class MacFactory : IGUIFactory
{
    public IButton CreateButton() => new MacButton();
    public IWindow CreateWindow() => new MacWindow();
}

// 使用
IGUIFactory factory = new WindowsFactory();
IButton button = factory.CreateButton();
IWindow window = factory.CreateWindow();

button.Click();
window.Open();

GDScript 示例

gdscript
# 抽象产品
class StyleButton:
	func click(): pass

class StyleWindow:
	func open(): pass

# 具体产品:森林风格
class ForestButton extends StyleButton:
	func click(): print("森林风格按钮被点击!")

class ForestWindow extends StyleWindow:
	func open(): print("森林风格窗口打开!")

# 具体产品:沙漠风格
class DesertButton extends StyleButton:
	func click(): print("沙漠风格按钮被点击!")

class DesertWindow extends StyleWindow:
	func open(): print("沙漠风格窗口打开!")

# 抽象工厂
class UIThemeFactory:
	func create_button() -> StyleButton: return null
	func create_window() -> StyleWindow: return null

# 具体工厂:森林主题
class ForestThemeFactory extends UIThemeFactory:
	func create_button() -> StyleButton: return ForestButton.new()
	func create_window() -> StyleWindow: return ForestWindow.new()

# 具体工厂:沙漠主题
class DesertThemeFactory extends UIThemeFactory:
	func create_button() -> StyleButton: return DesertButton.new()
	func create_window() -> StyleWindow: return DesertWindow.new()
	
# 使用
func _ready():
    var factory: UIThemeFactory = ForestThemeFactory.new()
    var button = factory.create_button()
    var window = factory.create_window()
    
    button.click()
    window.open()