5分钟学设计模式:简单工厂与美食街的不期而遇

news/2024/9/24 19:25:25

大家好,我是知微。

写代码好几年,是不是还纠结于这些问题:

  • 面对一堆if-else,代码越写越长,维护起来比攀登珠穆朗玛峰还难
  • 每次只敢小心翼翼改个小功能,生怕程序突然“嘭”一声,全炸了
  • 想学习大佬们的代码,却总是看得一头雾水,不知如何下手。

别急,优秀的代码设计往往有秘诀——设计模式。模仿只是表面,理解背后的设计哲学才是关键。

设计模式,何方神圣?

在编程的江湖里,设计模式就是解决问题的宝典,是前辈们在软件开发中留下的宝贵经验,帮我们写出可复用、灵活、高效的代码。

设计模式,三分天下

设计模式大致分为三类:

  1. 创建型模式:关注对象的诞生,如何优雅地创建和管理对象。
  2. 结构型模式:关注类和对象的“排列组合”,化简为繁,构建复杂系统。
  3. 行为型模式:关注对象之间的“互动”,定义它们如何协同工作。

“唉,又来这些概念,头都大了!”

行了行了,不卖关子了,咱们直接进入正题:简单工厂模式

第一幕:美食街的邂逅

晚上11点,你终于结束了一天的工作,疲惫地走在回家的路上。经过一条热闹的美食街,空气中弥漫着各种美食的香味,让你不由自主地停下了脚步。

你心想:“万事皆空,唯美食不可辜负,今天一定要好好犒劳自己!”但打开微信钱包一看,发现余额只剩下5块。你叹了口气,只能找个小吃摊随便吃点。

你走向最近的一个摊位,对老板说:“老板,来份煎饼果子!”

老板热情地回应:“好嘞,加不加鸡蛋?”

你摆了摆手,老板见状,便开始熟练地制作起来。

用代码表示

class Pancake {
public:void serve() {std::cout << "你的煎饼果子好了!" << std::endl;}
};int main() {Pancake p;p.serve(); // 顾客:老板,来份煎饼果子!return 0;
}

第二幕:美食街的新品

几周后,你再次来到美食街,老板热情地向你推荐:“我们最近新增了鸡蛋灌饼,要不要尝尝?”你心想,既然来了,不妨试试新口味。

你对老板说:“老板,那就来份鸡蛋灌饼吧!”

老板手脚麻利,很快为你准备好了热腾腾的鸡蛋灌饼。

用代码表示

// ...之前的煎饼果子的代码class EggPancake {
public:void serve() {std::cout << "热腾腾的鸡蛋灌饼好了!" << std::endl;}
};int main() {// ...之前的煎饼果子的代码EggPancake ep;ep.serve(); // 顾客:老板,来份鸡蛋灌饼吧!return 0;
}

第三幕:美食街的繁荣

随着时间的流逝,美食街越来越繁荣,小吃摊也增加了更多的小吃品种,如手抓饼和肉夹馍。每次光顾,你都能尝试不同的美食。

用代码表示

// ...之前的煎饼果子和鸡蛋灌饼的代码
class HandPies {
public:void serve() {std::cout << "香脆的手抓饼好了!" << std::endl;}
};class RouJiaMo {
public:void serve() {std::cout << "美味的肉夹馍好了!" << std::endl;}
};int main() {// ...之前的煎饼果子和鸡蛋灌饼的代码HandPies hp;hp.serve(); // 顾客:老板,来份手抓饼!RouJiaMo rjm;rjm.serve(); // 顾客:老板,来个肉夹馍!return 0;
}

第四幕:简单工厂的引入

你注意到,随着小吃种类的增加,老板开始使用一张菜单,上面列出了所有可以提供的小吃。每次你只需要告诉老板你想要什么,老板就会从菜单上找到对应的小吃,然后为你准备。

你突然灵光一闪,这不正是编程中的简单工厂模式吗?通过一个统一的接口来创建不同的对象。

引入简单工厂模式

#include <memory>
#include <string>
#include <iostream>class Snack {
public:virtual void serve() = 0;virtual ~Snack() {}
};class Pancake : public Snack {
public:void serve() override {std::cout << "你的煎饼果子好了!" << std::endl;}
};class EggPancake : public Snack {
public:void serve() override {std::cout << "热腾腾的鸡蛋灌饼好了!" << std::endl;}
};// ...其他小吃类class SnackFactory {
public:static std::unique_ptr<Snack> createSnack(const std::string& type) {if (type == "PANCAKE") {return std::make_unique<Pancake>();}// ...根据类型创建其他小吃return nullptr;}
};int main() {auto snack = SnackFactory::createSnack("PANCAKE");snack->serve(); // 顾客:老板,来份煎饼果子!// ...根据顾客的选择,创建其他小吃return 0;
}

采用简单工厂模式,美食街的老板就能轻松满足顾客的各种小吃需求,顾客点餐也变得更快捷。

这个模式的妙处在于,它把创建小吃对象的过程从原来的地方挪到了一个专门的“工厂”里。一开始,你可能觉得这个改变没啥大不了的,特别是当你的程序还很简单,只有几个类的时候。但是,随着你的程序越来越庞大和复杂,这个模式的好处就会慢慢显现出来。

  • 简化代码:你不用再代码的各个角落重复写创建对象的代码了。
  • 易于管理:所有的创建逻辑都集中在工厂类里,改起来简单多了。
  • 扩展方便:想加个新小吃?在工厂类里添几行代码就行,不用满世界找代码改。
  • 减少依赖:你的代码块之间互相依赖少了,更像是独立的模块。

值得注意的是,尽管简单工厂模式没有被列入GoF的23种经典设计模式,但它在软件开发实践中仍然非常有用,特别是对于新手来说,它是学习面向对象设计原则和设计模式的一个很好的起点。

以上就是简单工厂模式的全部内容了,后面我会接着介绍GoF的23种经典设计模式,敬请期待!

📢你的每一次👍点赞 ⭐收藏 📝评论,都是我更新的动力,如有错误请留言指正,非常感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30939.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

探索Django:从项目创建到图片上传的全方位指南

通过本文,我们深入了解了 Django 框架的一些基本概念和使用方法,以及如何利用 Django 构建一个简单的图像上传应用程序。从项目创建到环境配置,再到 admin 端图像处理和用户图片上传,我们逐步学习了如何利用 Django 提供的功能快速搭建 Web 应用。无论是对于初学者还是有一…

代码随想录算法训练营day06 | 242.有效字母异位词

242.有效的字母异位词 题目链接 文章讲解 视频讲解时间复杂度 o(n) 空间复杂度 o(n)class Solution { public:bool isAnagram(string s, string t) {unordered_map<char, int> s_map, t_map;for(char ch : s) s_map[ch]++;for(char ch : t) t_map[ch]++;return s_map == …

k8s 部署flannel时遇到问题

journalctl -f -u kubelet.service原因在于/opt/cni/bin/ 下没有生成flannel这个文件 需要重master节点拷贝到 node 节点 /opt/cni/bin/这个目录下 同事需要创建 /etc/cni/net.d/这个目录下生成flannel文件

CentOS7部署ES(单机)

一、创建路径,解压 ## 创建路径 [root@localhost /]# cd /data [root@localhost data]# mkdir ES ## 解压 [root@localhost data]# cd ES [root@localhost ES]# ls elasticsearch-8.11.3-linux-x86_64.tar.gz [root@localhost ES]# tar -zxvf elasticsearch-8.11.3-linux-x86_…

.net code 通过RFC链接SAP函数

可以使用SapNwRfc封装包来调用SAP NetWeaver RFC函数 SapNwRfc封装包使用可以参考:https://github.com/huysentruitw/SapNwRfc 注意点:1、SapNwRfc运行有个先决条件 ,需要下载vcredist_x64.exe ,安装依赖的SDK 本地环境和服务器最好都安装一下。 2、下图这6个动态库需要放…

一个不知名的开源项目可以带来多少收入

在过去的 12 个月里(2023 年 5 月 至 2024 年 4 月),我们的收入共计人民币 226 万元(外币全部兑换成人民币)。一个不知名的开源项目可以带来多少收入 —— NocoBase 3 年总结分享 起源 2020 年新冠疫情开始蔓延,当时我在同时经营 3 个不同的公司。除了其中的体育赛事平台…

TB67S128FTG步进电机驱动器电路图

东芝最新推出的128高细分50V/5A大电流输出的纯硬件方式的步进电机驱动IC-TB67S128FTG,附件为其电路图参考。 链接:https://wenku.csdn.net/doc/6468973f543f844488bae315

(转载)数据结构-01-图解后缀表达式值计算方式

目录:数据结构-01-图解后缀表达式值计算方式 数据结构-02 图解中缀表达式转后缀表达式并计算值1.简介 问题:我们平常使用的数学表达式大多数是“中缀表达式”例如:9+(3-1)3+102,对人比较友好,但是这个对计算机计算并不友好,因为计算机无法智能判断运算顺序的问题(比如说乘…