93、23种设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是23种设计模式中的创建型模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,适用于需要保证产品族兼容性、隔离产品创建细节的场景,但扩展新产品种类时需修改核心接口,可能违反开闭原则。 以下是详细介绍:
一、模式定义与核心角色
抽象工厂模式通过抽象接口定义产品族的创建规则,将具体产品的创建延迟到子类实现。其核心包含四个角色:
1.抽象工厂(Abstract Factory)
定义创建产品族的接口,包含多个创建产品的方法(如createButton()、createWindow())。
2.具体工厂(Concrete Factory)
实现抽象工厂接口,负责创建特定产品族的对象(如WindowsFactory创建Windows风格的按钮和窗口)。
3.抽象产品(Abstract Product)
为每种产品定义公共接口(如Button接口的click()方法)。
4.具体产品(Concrete Product)
实现抽象产品接口,由具体工厂创建(如WindowsButton实现Windows按钮的点击行为)。
二、模式特点与优缺点
1.优点
- 产品族兼容性:确保同一工厂创建的对象风格一致(如Windows工厂生成的按钮和窗口均符合Windows设计规范)。
- 解耦客户端与实现:客户端仅依赖抽象接口,无需关心具体产品类的创建细节(如切换UI风格时只需更换工厂实例)。
- 符合开闭原则(部分场景):新增产品族时,只需扩展具体工厂类,无需修改现有代码(如新增Mac风格UI只需添加MacFactory)。
2.缺点
- 扩展产品种类困难:新增产品类型需修改抽象工厂接口及所有子类(如增加createMenuBar()方法需更新所有工厂类)。
- 系统复杂性增加:引入多层抽象结构,可能提升理解难度(尤其在产品族和产品等级结构复杂时)。
三、典型应用场景
1.跨平台UI框架
为不同操作系统(Windows、Mac、Linux)创建风格统一的控件(如按钮、文本框),保证界面一致性。
2.数据库访问层
支持多种数据库(MySQL、Oracle、SQL Server),通过抽象工厂屏蔽底层差异,提供统一的数据访问接口。
3.游戏开发
为不同主题或阵营批量生成关联角色、武器和道具(如奇幻主题的精灵、法杖和魔法书)。
4.品牌产品线管理
管理不同品牌(如家电、汽车)的系列产品族,确保产品间功能匹配(如汽车品牌的发动机、轮胎和座椅兼容性)。
四、代码示例(C#)
下面是一个完整的抽象工厂模式在C#中的实现示例,以创建跨平台UI组件为例:
1.定义抽象产品接
// 抽象按钮接口
public interface IButton
{void Render();
}// 抽象复选框接口
public interface ICheckbox
{void Render();
}
2. 创建具体产品实现
// Windows风格按钮
public class WindowsButton : IButton
{public void Render(){Console.WriteLine("渲染Windows风格按钮");}
}// MacOS风格按钮
public class MacOSButton : IButton
{public void Render(){Console.WriteLine("渲染MacOS风格按钮");}
}// Windows风格复选框
public class WindowsCheckbox : ICheckbox
{public void Render(){Console.WriteLine("渲染Windows风格复选框");}
}// MacOS风格复选框
public class MacOSCheckbox : ICheckbox
{public void Render(){Console.WriteLine("渲染MacOS风格复选框");}
}
3. 定义抽象工厂接口
public interface IUIFactory
{IButton CreateButton();ICheckbox CreateCheckbox();
}
4. 创建具体工厂实现
// Windows UI工厂
public class WindowsUIFactory : IUIFactory
{public IButton CreateButton(){return new WindowsButton();}public ICheckbox CreateCheckbox(){return new WindowsCheckbox();}
}// MacOS UI工厂
public class MacOSUIFactory : IUIFactory
{public IButton CreateButton(){return new MacOSButton();}public ICheckbox CreateCheckbox(){return new MacOSCheckbox();}
}
5. 客户端代码
public class Application
{private IButton button;private ICheckbox checkbox;public Application(IUIFactory factory){button = factory.CreateButton();checkbox = factory.CreateCheckbox();}public void RenderUI(){button.Render();checkbox.Render();}
}class Program
{static void Main(string[] args){// 根据当前操作系统选择工厂IUIFactory factory;if (Environment.OSVersion.Platform == PlatformID.Win32NT){factory = new WindowsUIFactory();}else{factory = new MacOSUIFactory();}// 创建应用并渲染UIvar app = new Application(factory);app.RenderUI();/* 输出示例(在Windows上):渲染Windows风格按钮渲染Windows风格复选框*/}
}
五、模式对比与扩展
1.与工厂方法模式的区别
- 工厂方法模式针对单个产品等级结构(如仅创建按钮),抽象工厂模式针对多个产品等级结构(如同时创建按钮和窗口)。
- 工厂方法模式的每个产品系列对应一个工厂类,抽象工厂模式的一个工厂类可创建多个相关产品。
2.扩展策略
- 结合单例模式:确保每个具体工厂类只有一个实例,避免重复创建(如数据库连接池工厂)。
- 结合建造者模式:处理复杂产品的构建细节(如游戏角色生成时,抽象工厂创建角色骨架,建造者模式填充属性)。