首页 > 其他分享 >设计模式之简单工厂模式(学习笔记)

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

时间:2024-07-16 20:53:19浏览次数:13  
标签:std return 对象 创建 笔记 工厂 设计模式 客户端

定义

简单工厂模式(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;
}

 

标签:std,return,对象,创建,笔记,工厂,设计模式,客户端
From: https://www.cnblogs.com/best-doraemon/p/18306085

相关文章

  • 中国白酒品鉴知识培训一-笔记
    一白酒文化白酒起源于农业 酒祖仪狄 杜康依傍长江而栖的四川、贵州,一直是我国白酒文化的重要发祥地和传承地。是舞动中国白酒金三角龙头,打造世界顶尖白酒的基地。我国是世界上最早酿酒的国家之一,对世界酿酒技术的发展作出了巨大贡献。酿造白酒离不开水、土、气、气、......
  • 点分树 学习笔记
    前言还真没有。点分树点分树是个神秘的东西。点分树是通过更改原树形态使树的层数变为稳定\(\logn\)的一种重构树。常用于解决与树原形态无关的带修改问题。是这样的,有些树上问题,看起来用别的树形结构做不了,点分治能做。但是它不仅多次询问(\(n\)同级),还带修,有时候甚至......
  • Java基础-学习笔记04
    04运算符进制1.运算符逻辑与&和短路与&&共同点:两个条件都为true时,结果为true,否则为false。&逻辑与:不管第一个条件是否为false,第二个条件都要判断;&&短路与:如果第一个条件判断为false,则第二个条件不会判断。逻辑或|和短路或||共同点:两个条件只要有一个成立,结果......
  • 第八天笔记(项目测试工具悟道使用)
    禅道一、禅道的介绍(1)定义禅道是一个项目管理工具,也是一个bug管理工具,还是一个用例管理工具。(2)作用:为了解决众多企业在管理中出现混乱,无序的现象,开发出来(3)来源:禅道属易软天川公司(4)禅道是集于产品管理,项目管理,测试管理于一身,同时包含事务管理,组织管理8众多功能,是中小企业管理......
  • Spring与设计模式总览
    Spring框架中的设计模式详解Spring框架不仅是Java企业级开发的主力军,其设计还蕴含了大量经典设计模式。这些模式贯穿于Spring的核心组件中,提升了框架的可维护性和扩展性。本文将深入探讨Spring框架中常见的设计模式及其应用。1.工厂模式(FactoryPattern)工厂模式是最常见......
  • 7/16 训练笔记
    闲话插,就硬插,插完就过了(P4781【模板】拉格朗日插值模板题,写拉格朗日插值即可。代码:#include<bits/stdc++.h>#defineintlonglong#definerep(i,l,r)for(inti=l;i<=r;i++)usingnamespacestd;constintmod=998244353;intx[2010],y[2010],n,k;int......
  • 低开开发笔记(八): 低代码编辑器实现撤销回退(命令模式,防抖处理)
    好家伙, 0.代码已开源https://github.com/Fattiger4399/ph_questionnaire-.git 1.事件触发我们先从事件的触发开始讲起大致上我们有两个思路可以选择1.监控用户行为2.监控数据变化 两种选择都会有较难处理的部分,这里我们先选第二个选项 关于监控数据,首......
  • 【Datawhale AI夏令营】 Task1 学习笔记
    目录一、baseline二、NLP模型自然语言处理的主要任务自然语言处理的技术和方法自然语言处理的应用自然语言处理的挑战 三、赛题理解 赛题背景赛事任务术语词典干预术语词典干预的主要特点术语词典干预的实施方法四、实操 步骤体会感想   学习目标:跑......
  • OpenCV开发笔记(七十八):在ubuntu上搭建opencv+python开发环境以及匹配识别Demo
    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140435870长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…OpenCV开发专栏......
  • DeepVT论文阅读笔记
    DeepVT:DeepView-TemporalInteractionNetworkforNewsRecommendation论文阅读笔记Abstract存在的问题:​ 以往的研究大多只是直接应用新闻层面的表征进行用户建模,新闻的标题、摘要、分类等观点只是被隐含和压缩到新闻的单一向量中,这就使得不同新闻中的不同观点无法相互影......