设计模式之工厂模式(学习笔记)

· 浏览次数 : 8

正文

定义

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类来决定实例化哪一个类。工厂方法使得类的实例化延迟到子类,这样可以让客户端在不需要知道具体类的情况下创建对象。工厂方法模式通过使用继承和多态性,允许子类来控制对象的创建方式,能够更好地应对对象创建的复杂性和变化性。
 

为什么使用工厂方法模式?

1. 遵循开闭原则

   - 工厂方法模式通过引入新的子类来扩展系统,而不需要修改现有代码,从而符合开闭原则。

2. 更灵活的对象创建

   - 工厂方法模式将对象创建延迟到子类,这样可以通过重写工厂方法来定制对象的创建过程。

3. 支持产品族的扩展

   - 当系统中有多个产品等级结构时,可以通过工厂方法模式来管理不同等级的产品创建过程。
 

实现步骤

1. 定义抽象产品类

   - 定义所有具体产品类的共同接口,客户端将通过这个接口来使用具体产品。

2. 实现具体产品类

   - 实现产品接口的具体产品类,这些类包含了产品的实际业务逻辑。

3. 定义抽象工厂类

   - 定义一个抽象工厂类,包含一个用于创建产品对象的抽象方法,子类将实现该方法来创建具体产品对象。

4. 实现具体工厂类

   - 继承抽象工厂类并实现其抽象方法,具体工厂类负责创建具体产品对象。
 

优缺点和适用场景

优点

1. 遵循开闭原则

   - 新增产品时无需修改已有系统代码,符合开闭原则。

2. 更灵活的对象创建

   - 子类可以通过重写工厂方法来定制对象的创建过程,提供更灵活的对象创建机制。

3. 支持产品族扩展

   - 能够很好地应对产品族的扩展和变化。
 

缺点

1. 增加类的数量

   - 每新增一种产品类型,都需要增加一个具体工厂类,可能导致系统中类的数量增加。

2. 复杂度增加

   - 与简单工厂模式相比,工厂方法模式引入了更多的类和接口,增加了系统的复杂性。
 

适用场景

1. 系统需要灵活和可扩展的对象创建机制

   - 当系统需要灵活地创建对象,并且能够应对产品族的变化时,可以使用工厂方法模式。

2. 遵循开闭原则

   - 当系统需要遵循开闭原则,避免修改现有代码来扩展新功能时,适合使用工厂方法模式。
 

工厂方法模式与简单工厂模式的对比

1. 职责分配

   - 简单工厂模式将对象创建集中在一个工厂类中,而工厂方法模式将对象创建延迟到具体子类中,职责更加分散。

2. 开闭原则

   - 简单工厂模式在引入新产品时需要修改工厂类,违背了开闭原则;工厂方法模式通过新增具体工厂类来扩展新产品,符合开闭原则。

3. 复杂性

   - 简单工厂模式结构较为简单,适用于创建逻辑不复杂的场景;工厂方法模式结构较为复杂,适用于创建逻辑复杂且需要灵活扩展的场景。
 

咖啡店的例子

我们可以使用工厂方法模式来实现咖啡店不同类型咖啡的创建。
#include <iostream>
#include <memory>
#include <string>

// 抽象产品类:咖啡
class Coffee {
public:
    virtual ~Coffee() {}
    virtual std::string getDescription() const = 0;
    virtual double cost() const = 0;
};

// 具体产品类:美式咖啡
class Americano : public Coffee {
public:
    std::string getDescription() const override {
        return "Americano";
    }
    double cost() const override {
        return 5.0;
    }
};

// 具体产品类:拿铁咖啡
class Latte : public Coffee {
public:
    std::string getDescription() const override {
        return "Latte";
    }
    double cost() const override {
        return 6.0;
    }
};

// 抽象工厂类
class CoffeeFactory {
public:
    virtual ~CoffeeFactory() {}
    virtual std::shared_ptr<Coffee> createCoffee() const = 0;
};

// 具体工厂类:美式咖啡工厂
class AmericanoFactory : public CoffeeFactory {
public:
    std::shared_ptr<Coffee> createCoffee() const override {
        return std::make_shared<Americano>();
    }
};

// 具体工厂类:拿铁咖啡工厂
class LatteFactory : public CoffeeFactory {
public:
    std::shared_ptr<Coffee> createCoffee() const override {
        return std::make_shared<Latte>();
    }
};

int main() {
    // 创建美式咖啡
    std::shared_ptr<CoffeeFactory> americanoFactory = std::make_shared<AmericanoFactory>();
    std::shared_ptr<Coffee> americano = americanoFactory->createCoffee();
    std::cout << "Description: " << americano->getDescription() << ", Cost: " << americano->cost() << " RMB" << std::endl;

    // 创建拿铁咖啡
    std::shared_ptr<CoffeeFactory> latteFactory = std::make_shared<LatteFactory>();
    std::shared_ptr<Coffee> latte = latteFactory->createCoffee();
    std::cout << "Description: " << latte->getDescription() << ", Cost: " << latte->cost() << " RMB" << std::endl;

    return 0;
}

 

与设计模式之工厂模式(学习笔记)相似的内容:

设计模式之工厂模式(学习笔记)

定义 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类来决定实例化哪一个类。工厂方法使得类的实例化延迟到子类,这样可以让客户端在不需要知道具体类的情况下创建对象。工厂方法模式通过使用继承和多态性,允许子类来控制对象的创建方式,能够更好地应对对象创建的复杂性和变化性。 为什么

设计模式之抽象工厂模式(学习笔记)

定义 抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或依赖的对象,而无需指定它们的具体类。抽象工厂模式将对象的创建过程抽象化,允许子类通过实现具体工厂类来定制对象的创建。 为什么使用抽象工厂模式 产品族的一致性 抽象工厂模式确保同一产品族中的对象之间的一致性。 部分遵循开闭原则

设计模式之简单工厂模式(学习笔记)

定义 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义一个用于创建对象的接口,但由一个单独的类来实现实际创建的工作。简单工厂模式通过在一个类中集中管理对象的创建过程,可以减少客户端与具体类之间的耦合,使得代码结构更加清晰和易于维护。通过专门定义一个类来负责创建

设计模式之适配器模式(学习笔记)

定义 适配器模式是一种结构型设计模式,它允许将一个类的接口转换为客户端希望的另一个接口。适配器使得原本由于接口不兼容而不能一起工作的类可以协同工作。通过创建适配器类,可以将现有类的接口转换成目标接口,从而使这些类能够在一起工作。 为什么使用适配器模式 兼容性 适配器模式能够解决由于接口不兼容而无法直

设计模式学习(二)工厂模式——工厂方法模式+注册表

目录工厂方法模式的瑕疵注册表 工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式,示例的类图如下: 考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过程中,就需要加以判断。 例如,在我的例子中,要根据连接到主机的

【23种设计模式】工厂方法模式(二)

## 前言 在讲述之工厂方法模式前,我们来先了解简单工厂模式,简单工厂模式是最简单的设计模式之一,它虽然不属于GoF的23种设计模式,但是应用也较为频繁,同时它也是学习其他创建型模式的基础。下面我们来先了解下简单工厂模式,然后针对它的缺点来引出工厂方法模式。 ## 简单工厂模式定义 **简单工厂模式

设计模式学习(三):工厂模式

设计模式学习(三):工厂模式 作者:Grey 原文地址: 博客园:设计模式学习(三):工厂模式 CSDN:设计模式学习(三):工厂模式 工厂模式 工厂模式是创建型模式,工厂模式分为:简单工厂,工厂方法和抽象工厂三种类型。 简单工厂 这个模式很简单,比如我们需要制造不同类型的鼠标,我们只需要创建一个鼠

设计模式学习(二)工厂模式——抽象工厂模式+注册表

目录前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用简单工厂改进 对于缺点①,我们可以使用简单工厂的思路来改进抽象工厂的初版代码。对于上一篇文章中的例子,我们去除Came

设计模式学习(二)工厂模式——抽象工厂模式

目录背景抽象工厂模式优点与缺点参考文章 背景 现在我需要开发一个相机操作模块,它可能在Windows下运行,也可能在Linux下运行。由于在厂家提供的SDK中,Windows下的SDK和Linux下的SDK是有区别的,因此对于一个品牌的相机,我们要创建两个类去封装这两个不同平台下的API。 我们先使

设计模式-C#实现简单工厂模式

前言 上一篇文章写了如何使用RabbitMQ做个简单的发送邮件项目,然后评论也是比较多,也是准备去学习一下如何确保RabbitMQ的消息可靠性,但是由于时间原因,先来说说设计模式中的简单工厂模式吧! 在了解简单工厂模式之前,我们要知道C#是一款面向对象的高级程序语言。它有3大特性,封装、继承、多态。