工厂设计模式

张开发
2026/6/26 9:44:04 15 分钟阅读
工厂设计模式
一、简单工厂模式Simple Factory1. 核心思想一个工厂类根据传入的参数决定创建哪一种具体产品对象。所有产品共用同一个工厂结构最简单也叫静态工厂模式。2. 模式结构抽象产品Product定义产品的公共接口具体产品ConcreteProduct实现抽象产品的具体类工厂类Factory提供静态方法根据参数创建不同产品3. C 代码实现以 ** 创建不同形状圆形、方形** 为例#include iostream using namespace std; // 1. 抽象产品定义公共接口 class Shape { public: virtual void draw() 0; // 纯虚函数抽象方法 virtual ~Shape() default; }; // 2. 具体产品圆形 class Circle : public Shape { public: void draw() override { cout 绘制圆形 ✅ endl; } }; // 具体产品方形 class Rectangle : public Shape { public: void draw() override { cout 绘制方形 ✅ endl; } }; // 3. 简单工厂类核心创建逻辑 class ShapeFactory { public: // 静态方法根据类型创建对应形状对象 static Shape* createShape(const string type) { if (type circle) { return new Circle(); } else if (type rectangle) { return new Rectangle(); } return nullptr; // 无匹配类型 } }; // 客户端使用 int main() { // 客户端只调用工厂不直接new Circle/Rectangle Shape* shape1 ShapeFactory::createShape(circle); Shape* shape2 ShapeFactory::createShape(rectangle); shape1-draw(); shape2-draw(); // 释放内存 delete shape1; delete shape2; return 0; }4. 优缺点表格优点缺点代码简单使用方便严重违背开闭原则新增产品必须修改工厂类客户端与具体产品解耦产品过多时工厂类代码臃肿统一管理对象创建无法形成继承结构扩展受限5. 应用场景产品类型数量少、几乎不扩展客户端只需要简单获取对象不关心创建逻辑小工具、简单业务模块如日志对象、配置对象创建二、工厂方法模式Factory Method1. 核心思想一个产品对应一个工厂不再共用一个工厂。抽象工厂定义创建接口每个具体产品对应一个具体工厂新增产品时只新增工厂类不修改原有代码→完全符合开闭原则2. 模式结构抽象产品具体产品抽象工厂定义创建产品的接口具体工厂每个工厂只创建一种产品3. C 代码实现延续形状案例改造为工厂方法#include iostream using namespace std; // 1. 抽象产品 class Shape { public: virtual void draw() 0; virtual ~Shape() default; }; // 2. 具体产品 class Circle : public Shape { public: void draw() override { cout 绘制圆形 endl; } }; class Rectangle : public Shape { public: void draw() override { cout 绘制方形 endl; } }; // 3. 抽象工厂定义创建接口 class ShapeFactory { public: virtual Shape* createShape() 0; virtual ~ShapeFactory() default; }; // 4. 具体工厂圆形工厂 class CircleFactory : public ShapeFactory { public: Shape* createShape() override { return new Circle(); } }; // 具体工厂方形工厂 class RectangleFactory : public ShapeFactory { public: Shape* createShape() override { return new Rectangle(); } }; // 客户端使用 int main() { // 创建圆形工厂 → 生产圆形 ShapeFactory* factory1 new CircleFactory(); Shape* circle factory1-createShape(); circle-draw(); // 创建方形工厂 → 生产方形 ShapeFactory* factory2 new RectangleFactory(); Shape* rect factory2-createShape(); rect-draw(); // 释放内存 delete circle; delete factory1; delete rect; delete factory2; return 0; }4. 优缺点表格优点缺点完全符合开闭原则新增产品只加类不改旧代码类数量爆炸每加一个产品就要加一个工厂类单一职责一个工厂只造一种产品结构比简单工厂复杂理解成本稍高解耦更彻底便于单元测试客户端需要知道不同工厂的存在5. 应用场景产品类型需要频繁扩展单一产品等级结构只有一类产品框架设计、中间件、SDK 底层如 Spring Bean 工厂三、抽象工厂模式Abstract Factory1. 核心思想工厂生产「产品族」而不是单个产品。产品族一组相关 / 相互依赖的产品如华为工厂生产华为手机 华为电脑一个抽象工厂可以创建多个不同类型的产品2. 模式结构抽象产品族多个抽象产品Phone、Computer具体产品族华为手机、华为电脑苹果手机、苹果电脑抽象工厂定义创建所有产品的接口具体工厂华为工厂、苹果工厂3. C 代码实现以电子设备产品族为例#include iostream using namespace std; // 1. 抽象产品A手机 class Phone { public: virtual void showBrand() 0; virtual ~Phone() default; }; // 抽象产品B电脑 class Computer { public: virtual void showBrand() 0; virtual ~Computer() default; }; // 2. 具体产品族华为 class HuaweiPhone : public Phone { public: void showBrand() override { cout 华为手机 endl; } }; class HuaweiComputer : public Computer { public: void showBrand() override { cout 华为电脑 endl; } }; // 具体产品族苹果 class ApplePhone : public Phone { public: void showBrand() override { cout 苹果手机 endl; } }; class AppleComputer : public Computer { public: void showBrand() override { cout 苹果电脑 endl; } }; // 3. 抽象工厂能生产手机电脑 class ElectronicFactory { public: virtual Phone* createPhone() 0; virtual Computer* createComputer() 0; virtual ~ElectronicFactory() default; }; // 4. 具体工厂华为工厂 class HuaweiFactory : public ElectronicFactory { public: Phone* createPhone() override { return new HuaweiPhone(); } Computer* createComputer() override { return new HuaweiComputer(); } }; // 具体工厂苹果工厂 class AppleFactory : public ElectronicFactory { public: Phone* createPhone() override { return new ApplePhone(); } Computer* createComputer() override { return new AppleComputer(); } }; // 客户端使用 int main() { // 华为工厂生产华为全家桶 ElectronicFactory* factory new HuaweiFactory(); Phone* phone factory-createPhone(); Computer* computer factory-createComputer(); phone-showBrand(); computer-showBrand(); // 切换为苹果工厂 factory new AppleFactory(); phone factory-createPhone(); computer factory-createComputer(); phone-showBrand(); computer-showBrand(); return 0; }4. 优缺点表格优点缺点保证产品族的一致性华为工厂只造华为产品扩展新产品极难要修改所有工厂类符合开闭原则新增产品族只加类结构最复杂理解成本最高强约束避免产品不匹配只适用于多产品族的固定结构5. 应用场景存在多个产品系列 / 产品族产品之间有依赖、约束关系系统需要切换不同的产品组合如换肤、多数据库兼容经典案例UI 组件库浅色 / 深色主题、数据库驱动工厂四、三代工厂模式核心对比必记表格模式核心特点开闭原则复杂度适用场景简单工厂一个工厂造所有产品❌ 违背低产品少、不扩展工厂方法一个工厂造一种产品✅ 遵守中单类产品、常扩展抽象工厂一个工厂造一族产品✅ 遵守高多产品族、固定结构五、工厂模式终极总结本质封装new过程解耦创建与使用简单工厂入门版适合小场景违反开闭工厂方法标准版最常用完美遵循开闭抽象工厂高级版适合多产品族约束性强所有工厂模式的共同优点降低代码耦合统一对象创建逻辑便于维护和扩展隐藏对象初始化细节

更多文章