首页 > 其他分享 >5分钟学设计模式:工厂方法,让你的代码像搭积木一样简单!

5分钟学设计模式:工厂方法,让你的代码像搭积木一样简单!

时间:2024-05-17 15:54:38浏览次数:20  
标签:代码 小吃 工厂 class 搭积木 顾客 设计模式 public 老板

大家好,我是知微。

上一次的美食街之旅中,我们探讨了简单工厂模式。今天,让我们继续在美食街的夜色中,探索工厂方法模式的奥秘。

第一幕:美食街的繁华

美食街上,小吃摊的生意越来越火,摊主们为了满足顾客的多样化需求,开始提供更多种类的小吃。

顾客(你):老板,听说你们这除了煎饼果子,还有其他好吃的?

老板:对啊,我们最近推出了烤冷面和章鱼小丸子,都非常受欢迎!

顾客(你):听起来不错,那各来一份吧!

老板:好嘞,马上给您做!

用代码表示

class Snack {
public:
    virtual void serve() = 0;
    virtual ~Snack() {}
};

class RoastedColdNoodles : public Snack {
public:
    void serve() override {
        std::cout << "你的烤冷面好了!" << std::endl;
    }
};

class OctopusBall : public Snack {
public:
    void serve() override {
        std::cout << "你的章鱼小丸子好了!" << std::endl;
    }
};

// 简单工厂
class SnackFactory {
public:
    static Snack* createSnack(const std::string& type) {
        if (type == "COLD_NOODLES") {
            return new RoastedColdNoodles();
        } else if (type == "OCTOPUS_BALL") {
            return new OctopusBall();
        }
        // ...其他小吃类型的创建
        return nullptr;
    }
};

第二幕:小吃摊的扩张

随着生意越来越好,老板一个人弄这么多种类的小吃(简单工厂模式,一个工厂做很多种类),很多时候都忙不过来,出餐速度慢了许多。

思考了几天之后,老板果断做了决定,让家人帮忙,多弄几个摊位,每个摊位都负责自己的小吃(工厂方法模式每个工厂只做对应的产品),顾客可以直接去找他们喜欢的摊位。

顾客(你):老板,我想吃手抓饼,但这家摊位只卖煎饼果子。

老板:没问题,我让我家手抓饼摊位的老板给你做。

顾客(你):这样啊,那我就放心了。

用代码表示

// 抽象产品
class Snack {
public:
    virtual void serve() = 0;
    virtual ~Snack() {}
};

// 具体产品
class HandPies : public Snack {
public:
    void serve() override {
        std::cout << "你的手抓饼好了!" << std::endl;
    }
};

// 简单工厂
class SnackFactory {
public:
    static Snack* createSnack(const std::string& type) {
        if (type == "HANDPIES") {
            return new HandPies();
        }
        // ...其他小吃类型的创建
        return nullptr;
    }
};

第三幕:小吃摊的专业化

老板的决定很快带来了变化,每个摊位都开始专注于自己的特色小吃,顾客可以直接向特定的摊位订购。

顾客(你):我听说这家的章鱼小丸子特别好吃,我就直接来这家摊位了。

章鱼小丸子老板:欢迎光临!我们的章鱼小丸子是这条街上最好吃的,马上就给您做。

顾客(你):太好了,我等不及要尝尝了。

用代码表示

// 抽象工厂
class SnackFactory {
public:
    virtual std::unique_ptr<Snack> createSnack() = 0;
    virtual ~SnackFactory() {}
};

// 具体工厂
class OctopusBallFactory : public SnackFactory {
public:
    std::unique_ptr<Snack> createSnack() override {
        return std::make_unique<OctopusBall>();
    }
};

// 客户端代码
int main() {
    OctopusBallFactory factory;
    auto snack = factory.createSnack();
    snack->serve(); // 章鱼小丸子老板:欢迎光临,我们的章鱼小丸子是这条街上最好吃的!
    return 0;
}

第四幕:小吃摊的繁荣

美食街上的小吃摊变成了一家家各具特色的小吃店,每家店都有自己的招牌小吃,顾客可以根据自己的口味,选择不同的店铺品尝小吃。

顾客(你):这条街上的小吃种类真多,每种都想尝尝。

老板:是啊,我们每家店都有自己的特色,欢迎您常来尝试。

顾客(你):我会的,下次再带朋友一起来。

用代码表示

// 可以为每种小吃创建不同的工厂类
class RoastedColdNoodlesFactory : public SnackFactory {
public:
    std::unique_ptr<Snack> createSnack() override {
        return std::make_unique<RoastedColdNoodles>();
    }
};

class PancakeFactory : public SnackFactory {
    // ...实现
};

// ...其他小吃工厂类

结语

工厂方法模式通过定义一个创建小吃的接口,让具体的工厂类负责生产具体的小吃产品。这样,当需要新增小吃种类时,只需新增相应的工厂,而无需修改既有代码,提高了程序的可扩展性和可维护性。

工厂方法模式的优缺点

  • 优点

    • 提高了代码的扩展性,新增小吃种类无需修改原有代码。
    • 将对象的创建和使用分离,提高了代码的灵活性。
    • 利用多态,可以在运行时决定创建哪种类型的产品。
  • 缺点

    • 随着产品种类的增加,可能需要创建很多工厂类,导致系统变得复杂。
    • 客户端需要知道具体的工厂类名称,可能降低了一些封装性。

应用场景

  • 当系统由多个部分组成,且各部分都有共同的生产对象的需求时。
  • 当需要强调对象创建和对象使用分离的场景时。

总结来说,简单工厂模式适合用于产品类型较少且不会频繁增加的情况,而工厂方法模式则适合于产品类型较多且可能会频繁增加的场合。

工厂方法模式通过使用多态减少了耦合,使得新增产品类型时,不需要修改工厂类,只需要添加相应的具体工厂类即可。

以上就是工厂方法模式的全部内容了,下一期,我们将带来抽象工厂模式的精彩故事,敬请期待!

标签:代码,小吃,工厂,class,搭积木,顾客,设计模式,public,老板
From: https://www.cnblogs.com/Wayne123/p/18197907

相关文章

  • 树链剖分代码细解
    总结回顾类文章,酌情观看。ShapeOfYou头图Linux找图太难了呜呜Theclubisn'tthebestplacetofindaloverSothebariswhereIgoMeandmyfriendsatthetabledoingshotsDrinkingfasterandthenwetalkslowYoucomeoverandstartupaconversat......
  • 设计模式05----适配器模式
    适配器模式:适配器模式(AdapterPattern)是一种结构型设计模式,它允许不兼容的接口协同工作。这种模式涉及到一个单独的类,该类负责将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以一起工作。例如:USB转接口就是适配器,它能够将各种不同类型的接口(如HDMI、......
  • ESP32+RS485参考代码要点+@环境esp-idf-v5.1.2 +vscode 草稿
    在环境esp-idf-v5.1.2+vscode 中,如何在一个文件内,调用另外一个文件夹内定义的函数。 设置帧内间隔(在传输线上,两个发送的字节之间的时间间隔,不超过3.5发送单个字节的时间。)通过函数esp_err_tuart_set_rx_timeout(uart_port_tuart_num,constuint8_ttout_thresh)实现此......
  • 设计模式学习(二)工厂模式——工厂方法模式
    目录前言工厂方法模式简介示例优点缺点使用场景前言前一篇文章介绍了简单工厂模式,提到了简单工厂模式的缺点(违反开闭原则,扩展困难),本文要介绍的工厂方法模式在一定程度上弥补了简单工厂模式的缺点。工厂方法模式简介工厂方法模式是创建型设计模式之一,它在抽象工厂类中声明创建......
  • Transformer中的layer norm(包含代码解释)
    https://blog.csdn.net/weixin_42596778/article/details/134848578 layerNorm的代码实现:importtorch#1.使用torch的layernorm来进行操作,然后看一下ln后的矩阵是什么样子#创建了一个2*3*4的随机矩阵batch_size,seq_size,dim=2,3,4embedding=torch.randn(bat......
  • 数据分享|SAS与eviews用ARIMA模型对我国大豆产量时间序列预测、稳定性、白噪声检验可
    全文链接:http://tecdat.cn/?p=31480最近我们被客户要求撰写关于ARIMA的研究报告,包括一些图形和统计输出。我国以前一直以来都是世界上大豆生产的第一大国。但由于各国的日益强大,导致我国豆种植面积和产量持续缩减。因此,预测我国的大豆产量对中国未来的经济发展有着极其重要的作......
  • 短语挖掘与流行度、一致性及信息度评估:基于文本挖掘与词频统计|附数据代码
    全文链接:https://tecdat.cn/?p=36193原文出处:拓端数据部落公众号在信息爆炸的时代,文本数据呈现出爆炸式的增长,从新闻报道、社交媒体到学术论文,无处不在的文本信息构成了我们获取知识和理解世界的重要来源。然而,如何从海量的文本数据中提取有价值的信息,尤其是那些能够反映主题、......
  • Ollama 源代码中值得阅读的部分
     阅读Ollama源代码以了解其内部工作机制、扩展功能或参与贡献。以下是一些值得重点关注的部分: 1.核心服务模块:查找负责启动和管理模型服务的主程序或类,这通常是整个项目的核心逻辑所在。关注如何初始化模型环境、加载模型权重、配置服务器端口和通信协议等关键步骤。 ......
  • 代码随想录算法训练营第第九天 | 28. 实现 strStr() 、459.重复的子字符串
    实现strStr()因为KMP算法很难,大家别奢求一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会好懂很多。或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。因为大家算法能力还没到,......
  • 新浪SAE为例-源代码的开发
    源代码就是指编写的最原始程序的代码。我们所运行的软件是要经过编写的,程序员编写程序的过程中需要他们的“语言”。就像音乐家用五线谱,建筑师用图纸,那程序员的工作的语言就是“源码”了。新浪SAE是新浪研发中心于2009年8月开始内部开发,并在2009年11月3日正式推出第一个Alpha版本......