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

一、定义与核心思想

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


二、使用场景

  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 小时前
HTML视频和音频
前端·html·音视频
喜欢便码2 小时前
JS小练习0.1——弹出姓名
java·前端·javascript
chase。2 小时前
【学习笔记】MeshCat: 基于three.js的远程可控3D可视化工具
javascript·笔记·学习
暗暗那2 小时前
【面试】什么是回流和重绘
前端·css·html
小宁爱Python2 小时前
用HTML和CSS绘制佩奇:我不是佩奇
前端·css·html
weifexie3 小时前
ruby可变参数
开发语言·前端·ruby
千野竹之卫3 小时前
3D珠宝渲染用什么软件比较好?渲染100邀请码1a12
开发语言·前端·javascript·3d·3dsmax
sunbyte3 小时前
初识 Three.js:开启你的 Web 3D 世界 ✨
前端·javascript·3d
半兽先生3 小时前
WebRtc 视频流卡顿黑屏解决方案
java·前端·webrtc
南星沐5 小时前
Spring Boot 常用依赖介绍
java·前端·spring boot