设计模式之--------工厂模式

一、定义与核心思想

工厂模式 ‌是一种创建型设计模式,用于‌封装对象的创建过程 ‌。其核心在于‌将对象的实例化逻辑与使用逻辑分离 ‌,客户端无需关心具体实现类,只需通过统一接口获取对象,实现‌解耦 ‌与‌扩展性‌。


二、使用场景

  1. 动态创建对象‌:根据运行时条件(如配置、用户输入)决定创建哪种对象。
  2. 隐藏复杂构造逻辑‌:对象初始化步骤较多或依赖外部资源时(如数据库连接)。
  3. 统一产品族创建‌:需要确保一组相关对象(如同一主题的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风格按钮和文本框

四、核心意义

  1. 解耦创建与使用
    客户端代码无需硬编码具体类名(如new Sedan()),只需通过工厂接口获取对象,降低模块间耦合。
  2. 集中管理创建逻辑
    当对象初始化需要复杂步骤(如读取配置、连接数据库)时,所有逻辑封装在工厂中,避免代码重复。
  3. 扩展性增强
    新增产品类型时(如新增HybridCar),只需扩展工厂类,无需修改客户端代码,符合‌开闭原则‌。
  4. 产品族一致性
    抽象工厂确保同一系列产品(如Windows风格组件)兼容协作,避免风格混用问题。

五、适用场景对比

场景类型 简单工厂 抽象工厂
适用场景 单一产品类型动态创建(如日志、汽车) 多系列产品族创建(如跨平台UI、主题换肤)
扩展方式 修改工厂类的switchif逻辑 新增具体工厂类(如LinuxUIFactory
复杂度

工厂模式通过‌封装变化点‌,将易变的对象创建逻辑隔离,使得系统更灵活、更易维护。在以下情况优先考虑使用:

  1. 系统中存在频繁变动的对象类型
  2. 需要统一管理资源(如数据库连接池)
  3. 产品之间存在强关联性(如UI主题一致性)
相关推荐
**之火2 分钟前
中止 Web 请求新方式 - AbortController API
开发语言·前端·javascript
我有一棵树18 分钟前
如何优雅的布局,height: 100% 的使用和 flex-grow: 1 的 min-height 陷阱
前端·css·html
知识分享小能手31 分钟前
微信小程序入门学习教程,从入门到精通,微信小程序页面交互 —— 知识点详解与案例实现(3)
前端·javascript·学习·react.js·微信小程序·小程序·交互
石小石Orz36 分钟前
思考许久,我还是提交了离职申请
前端
m0_6161884938 分钟前
CSS中的伪类和伪元素
前端·javascript·css
一个小潘桃鸭39 分钟前
组件抽离:el-upload支持图片粘贴上传并添加预览
前端
快乐就好ya1 小时前
React基础到进阶
前端·javascript·react.js
小龙在山东1 小时前
VS Code 使用 Chrome DevTools MCP 实现浏览器自动化
前端·自动化·chrome devtools
悠哉摸鱼大王1 小时前
多模态场景下tts功能实现
前端·javascript
东华帝君1 小时前
__proto__对比prototype
前端