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

一、定义与核心思想

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


二、使用场景

  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主题一致性)
相关推荐
香蕉可乐荷包蛋29 分钟前
Three.js在vue中的使用(二)-动画、材质
javascript·vue.js·材质
sasaraku.4 小时前
INP指标
前端
大G哥6 小时前
【微服务】SpringBoot制作Docker镜像接入SkyWalking详解
spring boot·docker·微服务·架构·skywalking
magic 2457 小时前
Spring 命名空间注入:p、c 与 .util 的深度解析
java·前端·spring
岁月漫长_7 小时前
【项目归档】数据抓取+GenAI+数据分析
分布式·chatgpt·架构·flask·fastapi·celery
钢铁男儿7 小时前
Python基本语法(函数partial)
前端·javascript·python
风清云淡_A7 小时前
【angular19】入门基础教程(三):关于angular里面的响应式数据入门使用
前端·angular.js
乌旭7 小时前
AIGC算力消耗白皮书:Stable Diffusion vs Midjourney的架构成本差异
人工智能·深度学习·stable diffusion·架构·aigc·midjourney·gpu算力
green_pine_8 小时前
Vue3学习笔记2——路由守卫
前端·vue.js·笔记·学习
空中湖8 小时前
纯前端专业PDF在线浏览器查看器工具
前端·pdf