当前位置: 首页 > news >正文

工厂方法模式 (Factory Method Pattern)

工厂方法模式 (Factory Method Pattern) 是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类。

一、基础

1. 意图

  • 定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。
  • 工厂方法模式让类的实例化推迟到子类。

2. 适用场景

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

3. 结构

  • 抽象产品(Product):定义了产品的接口,是所有具体产品类的父类。​
  • 具体产品(ConcreteProduct):实现了抽象产品接口,是具体被创建的对象。​
  • 抽象工厂(Creator):声明了工厂方法,该方法返回一个抽象产品类型的对象。抽象工厂可以有一些具体的方法,用于处理与创建对象相关的通用逻辑。​
  • 具体工厂(ConcreteCreator):实现了抽象工厂中的工厂方法,负责创建具体的产品对象。​

二、进阶

1. 工厂方法模式的优点

  • 让代码独立于特定类,从而更容易扩展和维护。
  • 将对象的创建和使用分离,从而提高代码的灵活性。
  • 提供一种创建对象的标准方式,从而提高代码的可读性和可维护性。

2. 工厂方法模式的缺点

  • 可能会导致类的数量增加,从而增加代码的复杂性。
  • 可能会降低代码的性能,因为每次创建对象时都需要调用工厂方法。

3. 工厂方法模式的应用

  • 广泛应用于各种框架和库中,例如 Spring 框架、Hibernate 框架等。
  • 可以用于开发各种应用程序,例如游戏、图形用户界面等。

三、关键点

 1. 工厂方法模式的实现

  • 可以通过接口或抽象类来实现。
  • 可以通过静态方法或实例方法来实现。

 2. 工厂方法模式的扩展

  • 可以与其他设计模式结合使用,例如单例模式、原型模式等。
  • 可以扩展为抽象工厂模式,从而支持创建一系列相关或依赖的对象。

四、易错点

 1. 工厂方法模式的滥用

  • 工厂方法模式不应该被滥用,只有在需要将对象的创建和使用分离时才应该使用工厂方法模式。

 2. 性能问题

  • 工厂方法模式可能会降低代码的性能,因为每次创建对象时都需要调用工厂方法。

五、核心代码

1. 工厂方法模式的简单实现

// Product
class Product {
public:
    virtual void use() = 0;
};

// ConcreteProductA
class ConcreteProductA : public Product {
public:
    void use() override {
        std::cout << "Using ConcreteProductA" << std::endl;
    }
};

// ConcreteProductB
class ConcreteProductB : public Product {
public:
    void use() override {
        std::cout << "Using ConcreteProductB" << std::endl;
    }
};

// Creator
class Creator {
public:
    virtual Product* createProduct() = 0;
};

// ConcreteCreatorA
class ConcreteCreatorA : public Creator {
public:
    Product* createProduct() override {
        return new ConcreteProductA();
    }
};

// ConcreteCreatorB
class ConcreteCreatorB : public Creator {
public:
    Product* createProduct() override {
        return new ConcreteProductB();
    }
};

// Client
int main() {
    Creator* creator = new ConcreteCreatorA();
    Product* product = creator->createProduct();
    product->use();

    delete creator;
    delete product;

    return 0;
}

5.2 工厂方法模式的扩展实现

// Product
class Product {
public:
    virtual void use() = 0;
};

// ConcreteProductA
class ConcreteProductA : public Product {
public:
    void use() override {
        std::cout << "Using ConcreteProductA" << std::endl;
    }
};

// ConcreteProductB
class ConcreteProductB : public Product {
public:
    void use() override {
        std::cout << "Using ConcreteProductB" << std::endl;
    }
};

// Creator
class Creator {
public:
    virtual Product* createProduct() = 0;
};

// ConcreteCreatorA
class ConcreteCreatorA : public Creator {
public:
    Product* createProduct() override {
        return new ConcreteProductA();
    }
};

// ConcreteCreatorB
class ConcreteCreatorB : public Creator {
public:
    Product* createProduct() override {
        return new ConcreteProductB();
    }
};

// Client
int main() {
    Creator* creator = new ConcreteCreatorA();
    Product* product = creator->createProduct();
    product->use();

    delete creator;
    delete product;

    creator = new ConcreteCreatorB();
    product = creator->createProduct();
    product->use();

    delete creator;
    delete product;

    return 0;
}

六、总结

工厂方法模式是一种强大的创建型设计模式,它将对象的创建逻辑封装在工厂类中,使得代码更加灵活和易于维护。通过合理运用工厂方法模式,可以有效提高软件系统的可扩展性和可维护性,降低代码的耦合度。

相关文章:

  • 人工智能之数学基础:保持几何结构不变的线性变换——正交变换
  • 查找Python环境中Matplotlib配置文件
  • 计算机的结构形式
  • 《Flutter:开源的跨平台移动应用开发框架》:此文为AI自动生成
  • 激活函数和批归一化(BatchNorm)
  • 数位小游戏
  • Vue生命周期_Vue生命周期钩子
  • 使用SetupTools 管理你的项目打包工作
  • 【后端开发面试题】每日 3 题(十三)
  • redis删除与先判断再删除的区别
  • 996引擎-问题处理:缺失特效分割文件 ModelAtlasSplitConfigs
  • 解锁下一代AI应用:开源项目mcp-server-qdrant如何重塑向量数据库管理?
  • 我与DeepSeek读《大型网站技术架构》- 总结
  • Python 本地翻译库 googletrans
  • 补充二分LIS
  • Obsidian Copilot:打造你的专属 AI 笔记助手
  • 一周学会Flask3 Python Web开发-SQLAlchemy查询所有数据操作-班级模块
  • 【排序算法对比】快速排序、归并排序、堆排序
  • Qt6编译安装linguist语言家
  • 农业电商|基于SprinBoot+vue的农业电商服务系统(源码+数据库+文档)
  • 特朗普再提“接管”加沙,要将其变为“自由区”
  • 光明日报:家长孩子共同“息屏”,也要保证高质量陪伴
  • 中科飞测将投资超10亿元,在上海张江成立第二总部
  • 《歌手2025》公布首发阵容,第一期就要淘汰一人
  • 陕西一村民被冒名贷款40余万续:名下已无贷款,将继续追责
  • 来沪一个月几乎未花住宿钱,女子虚构卫生问题屡薅酒店羊毛被刑拘