抽象工厂
提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。
适合的场景
普通工厂模式适合创建单个产品,但有时候我们需要多个产品协同工作,比如:
一个UI系统:按钮、窗口、文本框都要统一风格
一个游戏阵营:精灵族的士兵、法师、建筑都是一套;兽人族又是另一套
一个关卡元素:背景、敌人、掉落物都成套变化
这时候,如果你还靠普通工厂一个个new,那就太笨重了!
抽象工厂让你一口气整套创建,并且切换起来超丝滑
它强调的是多个相关产品的成套创建,比普通工厂更高级也更复杂些。 但一旦用起来,维护和扩展都很舒服,不容易出错。
基本结构
抽象产品族接口(多个产品接口)
具体产品族实现(多个产品的实现)
抽象工厂接口(包含一组产品的创建方法)
具体工厂实现(对应的产品族)
示例
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()