首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年07月17日 09:13

定义

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

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

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

 

From:https://www.cnblogs.com/best-doraemon/p/18306190
本文地址: http://shuzixingkong.net/article/73
0评论
提交 加载更多评论
其他文章 发卡宝卡密寄售系统存在SQL注入漏洞
发卡宝卡密寄售系统存在SQL注入漏洞,漏洞产生于/shop/alipay_notify.php 文件中,post参数直接传入out_trade_no,没有进行任何过滤,并且直接拼接SQL语句进行查询,导致前台SQL注入
发卡宝卡密寄售系统存在SQL注入漏洞 发卡宝卡密寄售系统存在SQL注入漏洞 发卡宝卡密寄售系统存在SQL注入漏洞
C++ MFC应用修改软件图标方法
用MFC开发的软件,生成后默认的软件图标是一个MFC三个字母。自己开发的软件很有必要修改为自己的图标。
C++ MFC应用修改软件图标方法 C++ MFC应用修改软件图标方法 C++ MFC应用修改软件图标方法
微信公众号无限回调系统SQL注入漏洞
微信公众平台无限回调系统存在SQL注入漏洞,漏洞文件存在于/user/ajax.php中
微信公众号无限回调系统SQL注入漏洞 微信公众号无限回调系统SQL注入漏洞 微信公众号无限回调系统SQL注入漏洞
.htaccess设置AddHandler或者SetHandler不生效的原因
这是因为windows下的php集成环境使用的是fastcgi模式来运行的php,所以不会生效。需要更换代码
.htaccess设置AddHandler或者SetHandler不生效的原因 .htaccess设置AddHandler或者SetHandler不生效的原因
折腾指南: 将光猫改造成你的NAS,WebDAV+网页文件管理器vList5+natmap
光猫在家里只能担当拨号上网的角色吗?不,稍加改造就是一台NAS! 在这里,使用natmap映射IPV4,使用nginx+njs+vList5打造在线文件预览+管理,使用nginx+davext实现远程文件管理 甚至还可以使用aria2下载磁力做下载器,使用clash让光猫变成真的猫!只要你敢想,光猫
折腾指南: 将光猫改造成你的NAS,WebDAV+网页文件管理器vList5+natmap 折腾指南: 将光猫改造成你的NAS,WebDAV+网页文件管理器vList5+natmap 折腾指南: 将光猫改造成你的NAS,WebDAV+网页文件管理器vList5+natmap
从Mybatis-Plus开始认识SerializedLambda
从Mybatis-Plus开始认识SerializedLambda 背景 对于使用过Mybatis-Plus的Java开发者来说,肯定对以下代码不陌生: @TableName(&quot;t_user&quot;) @Data public class User { private String i
Linux 文件夹和文件操作【Linux 常用命令系列一】
本文首先介绍了 Linux 中文件的结构,将全部文件夹罗列并介绍了大概的用途,然后通过实例介绍了文件夹相关的常用操作,仅供参考。
低开开发笔记(八): 低代码编辑器实现撤销回退(命令模式,防抖处理)
好家伙, 0.代码已开源 https://github.com/Fattiger4399/ph_questionnaire-.git 1.事件触发 我们先从事件的触发开始讲起 大致上我们有两个思路可以选择 1.监控用户行为 2.监控数据变化 两种选择都会有较难处理的部分,这里我们先选第二个选项 关于
低开开发笔记(八): 低代码编辑器实现撤销回退(命令模式,防抖处理) 低开开发笔记(八): 低代码编辑器实现撤销回退(命令模式,防抖处理)