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

一、定义与核心思想

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


二、使用场景

  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主题一致性)
相关推荐
申阳1 小时前
Day 7:05. 基于Nuxt开发博客项目-首页开发
前端·后端·程序员
Crystal3281 小时前
App端用户每日弹出签到弹窗如何实现?(uniapp+Vue)
前端·vue.js
摸着石头过河的石头1 小时前
Service Worker 深度解析:让你的 Web 应用离线也能飞
前端·javascript·性能优化
用户4099322502121 小时前
Vue 3中watch侦听器的正确使用姿势你掌握了吗?深度监听、与watchEffect的差异及常见报错解析
前端·ai编程·trae
1024小神1 小时前
Xcode 常用使用技巧说明,总有一个帮助你
前端
政采云技术2 小时前
音视频通用组件设计探索和应用
前端·音视频开发
不爱吃糖的程序媛2 小时前
Electron 如何判断运行平台是鸿蒙系统(OpenHarmony)
javascript·electron·harmonyos
Hilaku2 小时前
我用AI重构了一段500行的屎山代码,这是我的Prompt和思考过程
前端·javascript·架构
Cxiaomu2 小时前
React Native App 自动检测版本更新完整实现指南
javascript·react native·react.js
IT_陈寒3 小时前
Vite性能优化实战:5个被低估的配置让你的开发效率提升50%
前端·人工智能·后端