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

· 浏览次数 : 62

正文

定义

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

为什么使用简单工厂模式?

  1. 统一管理对象创建:
    • 简单工厂模式将对象的创建逻辑集中到一个工厂类中,客户端不需要知道具体的创建细节,只需调用工厂类提供的方法即可获得所需的对象,减少了客户端对类创建过程的依赖。
  2. 减少耦合:
    • 客户端与具体类之间的依赖被转移到了工厂类,客户端不再直接依赖具体类,从而降低了系统的耦合度。
  3. 更好的维护性:
    • 当需要更改对象的创建逻辑或引入新的对象类型时,只需修改工厂类,而不需要修改客户端代码,提高了系统的可维护性。

实现步骤

  1. 定义抽象产品类

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

    • 实现产品接口的具体产品类,这些类包含了产品的实际业务逻辑。
  3. 定义工厂类

    • 定义一个工厂类,包含一个用于创建产品对象的静态方法,根据不同的参数来实例化不同的具体产品类,并返回产品接口类型的对象。

优缺点和适用场景

优点

  1. 统一管理对象创建

    • 将对象创建逻辑集中管理,使代码更加清晰易懂。
  2. 减少客户端与具体类的耦合

    • 客户端只需依赖于产品接口和工厂类,不再直接依赖具体产品类。
  3. 便于扩展和维护

    • 添加新产品类时,只需修改工厂类,客户端代码无需变动。

缺点

  1. 工厂类的职责过重

    • 工厂类集中了所有产品对象的创建逻辑,可能导致代码过于复杂,不利于扩展。
  2. 不符合开闭原则

    • 添加新产品时需要修改工厂类的代码,违背了开闭原则。

适用场景

  1. 对象创建逻辑复杂

    • 当对象的创建过程较为复杂时,可以使用简单工厂模式将创建逻辑集中管理,简化客户端代码。
  2. 客户端不需要关心对象的创建细节

    • 当客户端不需要知道对象的创建过程,只需使用对象时,可以使用简单工厂模式隐藏创建细节。

咖啡店的例子

假设我们有一个咖啡店,根据客户的需求生产不同类型的咖啡。我们可以使用简单工厂模式来实现咖啡的创建。
#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:
    enum CoffeeType {
        AMERICANO,
        LATTE
    };


    static std::shared_ptr<Coffee> createCoffee(CoffeeType type) {
        switch (type) {
            case AMERICANO:
                return std::make_shared<Americano>();
            case LATTE:
                return std::make_shared<Latte>();
            default:
                return nullptr;
        }
    }
};


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


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


    return 0;
}

 

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

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

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

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

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

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

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

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

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

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

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

软件设计模式系列之四——简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于对象的创建,它属于工厂模式的一种。简单工厂模式的主要目标是封装对象的创建过程,使客户端代码与具体类的实例化解耦,从而提高代码的可维护性和可扩展性。

Simple Factory 简单工厂模式简介与 C# 示例【创建型3.1】【设计模式来了_3.1】

本文通过简单的实例对简单工厂模式进行了介绍。

简易的工厂设计模式

工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需暴露对象的创建逻辑。在工厂模式中,我们定义一个接口或抽象类,该接口或抽象类用于创建对象,但让子类决定要实例化的类。工厂方法模式使类的实例化延迟到其子类。 下面是一个完整的C#实现案例: 首先,我们定义一个接口,用于创建对象: p

Abstract Factory 抽象工厂模式简介与 C# 示例【创建型1】【设计模式来了_1】

通过对抽象类和抽象工厂的一组实现,独立出一系列新的操作,客户端无需了解其逻辑直接访问。

Factory Method 工厂方法模式简介与 C# 示例【创建型3】【设计模式来了_3】

本文通过实例介绍了工厂方法模式的用法。