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

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

时间:2024-07-17 10:20:12浏览次数:15  
标签:std 创建 模式 工厂 笔记 shared 设计模式 public

定义

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

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

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;
}

 

标签:std,创建,模式,工厂,笔记,shared,设计模式,public
From: https://www.cnblogs.com/best-doraemon/p/18306190

相关文章

  • 开发基础笔记
    1、Springboot2.0以后默认的数据库连接池是哪个? Springboot2.0以后默认的数据库连接池是哪个SpringBoot2.0后默认的数据库连接池是HikariCP。HikariCP是一个高性能的数据库连接池,它的性能远远超过其他传统的数据库连接池,如C3P0、DBCP和Tomcat的连接池。如果......
  • 利用anki实现电子笔记与滑记手机端/平板端同步
    适用对象:希望利用anki类工具随时复习,但是手机平板端制造卡片成本较高,希望通过电脑端制作卡片并且同步至滑记1,在电脑上下载anki网址:https://apps.ankiweb.net/点击download,选择你要下载的版本2,下载完后,打开anki,并制作卡片滑记在手机平板端也可以制作卡片,但是相比于使用电脑操......
  • 设计模式-C#实现简单工厂模式
    前言上一篇文章写了如何使用RabbitMQ做个简单的发送邮件项目,然后评论也是比较多,也是准备去学习一下如何确保RabbitMQ的消息可靠性,但是由于时间原因,先来说说设计模式中的简单工厂模式吧!在了解简单工厂模式之前,我们要知道C#是一款面向对象的高级程序语言。它有3大特性,封装、继承、......
  • Java计算机毕业设计高校笔记分享系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在高等教育领域,随着知识量的急剧增长和学习方式的多样化,学生如何高效地整理、保存并分享学习笔记成为了一个日益凸显的问题。传统的手写笔记虽然有助......
  • 勾股定理学习笔记
    第一章勾股定理1.1勾股定理的证明对于勾股定理,有约\(500\)种证明方法。常见的有数格子(见课本勾股数)、赵爽弦图(两种)、加菲尔德证法(总统图)、毕达哥拉斯证法、华蘅芳证法、百牛定理证法、商高定理证法、商高证法、刘徽证法、绉元智证法等。这里只列出常见的几种方法。1.1.1......
  • 中国白酒品鉴知识培训三-品牌知识-笔记
     汾酒的起源-成立于1949年1949年6月1日,成立国营汾阳杏花酒厂(将义泉泳和晋泉公酒厂合并一处)。中华人民共和国第一个地方国营酿酒企业。1949年6月1日,成立国营汾阳杏花酒厂。 茅台的起源-成立于1951年华联辉1862年:成义烧房王炳乾1879年:荣和烧房赖永初1941年:恒兴烧房1951......
  • 中国白酒品鉴知识培训二之香型-笔记
    1浓香型工艺特点单粮,高粱,多粮,高粱,大米,糯米,小麦,玉米中偏高温大曲(小米为主制成)发酵设备 泥窖发酵周期45-90天2酱香型白酒特点原料:高粱糖化发酵剂,高温大曲(小米制成)发酵设备和形式:条石窖固态发酵发酵时间,八轮次每次一个月工艺特点,两次投粮,多轮次发酵,四高二长3清香......
  • 【学习笔记】初等数论
    [学习笔记]初等数论最大公约数\(gcd\)欧几里得算法(辗转相除法):\[\gcd(a,b)=\gcd(b,a\bmodb)\]代码:intgcd(inta,intb){returnb?gcd(b,a%b):a;}或者直接使用__gcd(a,b)。辗转相减法:\[\gcd(a,b)=\gcd(a,b-a)\]推广到\(n\)项:\[\gcd(a_1,a_2......
  • 7月16日JavaSE学习笔记
    方法(函数、过程)语法返回值类型方法名(参数列表){方法体}返回值类型:该方法必须返回的一个这个类型的对象当方法不需要返回值时,返回值类型就定义为voidpublicstaticintmax(inta,intb){intmax=a>b?a:b;//方法名和变量名不会冲突//return返回......
  • 信创学习笔记(四),信创之数据库DB思维导图
    创作不易只因热爱!!热衷分享,一起成长!“你的鼓励就是我努力付出的动力”一.信创学习回顾1.信创内容信创内容思维导图2.信创之CPU芯片架构信创之CPU芯片架构思维导图3.信创之操作系统OS信创之操作系统OS思维导图二.信创之国产数据库DB思维导图用一张图学习......