一、定义与核心思想
工厂模式 是一种创建型设计模式,用于封装对象的创建过程 。其核心在于将对象的实例化逻辑与使用逻辑分离 ,客户端无需关心具体实现类,只需通过统一接口获取对象,实现解耦 与扩展性。
二、使用场景
- 动态创建对象:根据运行时条件(如配置、用户输入)决定创建哪种对象。
- 隐藏复杂构造逻辑:对象初始化步骤较多或依赖外部资源时(如数据库连接)。
- 统一产品族创建:需要确保一组相关对象(如同一主题的UI组件)兼容使用时。
三、代码示例
示例1:简单工厂模式(汽车工厂)
场景:根据用户选择的车型动态创建汽车对象。
scala
// 汽车基类
class Car {
drive() {
throw new Error("必须实现 drive 方法");
}
}
// 具体产品类
class Sedan extends Car {
drive() {
console.log("驾驶轿车,平稳省油");
}
}
class SUV extends Car {
drive() {
console.log("驾驶SUV,动力强劲");
}
}
// 简单工厂
class CarFactory {
static createCar(type) {
switch (type) {
case 'sedan':
return new Sedan();
case 'suv':
return new SUV();
default:
throw new Error(`未知车型: ${type}`);
}
}
}
// 使用
const car1 = CarFactory.createCar('sedan');
car1.drive(); // 输出: 驾驶轿车,平稳省油
const car2 = CarFactory.createCar('suv');
car2.drive(); // 输出: 驾驶SUV,动力强劲
示例2:抽象工厂模式(跨平台UI组件)
场景:为不同操作系统(Windows/Mac)创建风格一致的UI组件。
scala
// 抽象产品接口
class Button {
render() {}
}
class TextBox {
render() {}
}
// Windows 产品族
class WindowsButton extends Button {
render() {
return "<button class='windows-btn'>Windows按钮</button>";
}
}
class WindowsTextBox extends TextBox {
render() {
return "<input type='text' class='windows-text'>";
}
}
// Mac 产品族
class MacButton extends Button {
render() {
return "<button class='mac-btn'>Mac按钮</button>";
}
}
class MacTextBox extends TextBox {
render() {
return "<input type='text' class='mac-text'>";
}
}
// 抽象工厂接口
class UIFactory {
createButton() {}
createTextBox() {}
}
// 具体工厂类
class WindowsUIFactory extends UIFactory {
createButton() {
return new WindowsButton();
}
createTextBox() {
return new WindowsTextBox();
}
}
class MacUIFactory extends UIFactory {
createButton() {
return new MacButton();
}
createTextBox() {
return new MacTextBox();
}
}
// 客户端代码
function createUI(factory) {
const button = factory.createButton();
const textBox = factory.createTextBox();
console.log(button.render(), textBox.render());
}
// 根据操作系统选择工厂
const os = 'mac'; // 可从配置读取
const factory = os === 'windows' ? new WindowsUIFactory() : new MacUIFactory();
createUI(factory);
// 输出Mac风格按钮和文本框
四、核心意义
- 解耦创建与使用
客户端代码无需硬编码具体类名(如new Sedan()
),只需通过工厂接口获取对象,降低模块间耦合。 - 集中管理创建逻辑
当对象初始化需要复杂步骤(如读取配置、连接数据库)时,所有逻辑封装在工厂中,避免代码重复。 - 扩展性增强
新增产品类型时(如新增HybridCar
),只需扩展工厂类,无需修改客户端代码,符合开闭原则。 - 产品族一致性
抽象工厂确保同一系列产品(如Windows风格组件)兼容协作,避免风格混用问题。
五、适用场景对比
场景类型 | 简单工厂 | 抽象工厂 |
---|---|---|
适用场景 | 单一产品类型动态创建(如日志、汽车) | 多系列产品族创建(如跨平台UI、主题换肤) |
扩展方式 | 修改工厂类的switch 或if 逻辑 |
新增具体工厂类(如LinuxUIFactory ) |
复杂度 | 低 | 高 |
工厂模式通过封装变化点,将易变的对象创建逻辑隔离,使得系统更灵活、更易维护。在以下情况优先考虑使用:
- 系统中存在频繁变动的对象类型
- 需要统一管理资源(如数据库连接池)
- 产品之间存在强关联性(如UI主题一致性)