首页 > 其他分享 >5分钟学设计模式:简单工厂与美食街的不期而遇

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

时间:2024-05-13 13:52:33浏览次数:20  
标签:代码 美食街 小吃 不期而遇 工厂 设计模式 老板

大家好,我是知微。

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

  • 面对一堆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种经典设计模式,敬请期待!

标签:代码,美食街,小吃,不期而遇,工厂,设计模式,老板
From: https://www.cnblogs.com/Wayne123/p/18189063

相关文章

  • 设计模式之单例模式
    单例模式提供了一种创建对象的最佳方式:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例类只能有一个实例;单例类必须自己创建自己的唯一实例;单例类必须给......
  • 设计模式04----原型模式
    原型模式(PrototypePattern)是一种创建型设计模式,在软件工程中用来创建对象的副本,从而避免新建对象时的性能开销。此模式利用已存在的对象实例作为原型,通过克隆(Clone)机制来创建新的对象,新对象与原型对象具有相同的属性和状态,但彼此独立,修改一个对象不会影响到另一个。原理与特点......
  • Java学设计模式之迭代器模式
    一、迭代器模式概念1.1什么是迭代器模式迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。简单来说,迭代器模式可以让你遍历一个集合对象,而无需了解其内部结构。结构迭代器(Iterator):定义了访问和遍历元素的接......
  • Java学设计模式之备忘录模式
    一、备忘录模式概念1.1什么是备忘录模式备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。这种模式通常用于需要实现撤销操作或者历史记录功能的场景。结构备忘录模式通常包含以下几个要素:Originator(发起人):定义了一个方法用于创建......
  • Java学设计模式之中介者模式
    一、中介者模式概念1.1什么是中介者模式中介者模式是一种行为型设计模式,它通过将对象之间的交互行为集中到一个中介者对象中来解耦对象之间的关联。这种模式被用来减少对象之间的直接通信,从而降低了系统的耦合度,使得系统易于维护和扩展。结构中介者模式通常包含以下几个要素:......
  • Java学设计模式之享元模式
    一、享元模式概念1.1什么是享元模式享元模式是一种结构型设计模式,旨在通过共享对象来最大程度地减少内存使用和提高性能。在享元模式中,对象被设计成可共享的,以便在需要时能够被多个不同的上下文使用。结构享元模式通常包含以下几个要素:Flyweight(享元):定义了共享对象的接口......
  • 设计模式之七大原则
    设计模式之七大原则(一)——单一职责原则、开放-关闭原则_系统设计原则单一职责隔离-CSDN博客一、设计模式的目的设计模式的目的是为了提高代码重用性、可读性、可扩展性、可靠性,使得程序呈现出高内聚、低耦合的特性。二、设计模式的七大原则我们在设计一些设计模式时,一般遵循......
  • 设计模式详解
    本文结构图:除了类本身,设计模式更强调多个类/对象之间的关系和交互过程——比接口/类复用的粒度更大创建型模式(Creationalpatterns)工厂方法模式(FactoryMethodpattern)工厂方法也被称作虚拟构造器(VirtualConstructor)即定义一个用于创建对象的接口,让子类类决定实例化......
  • 设计模式03----构造者模式
    构造者模式:是一种创建型设计模式,是将一个对象拆分成多个部件分别进行构造然后组合成为一个整体的设计模式产品(Product):被构建的复杂对象,通常包含多个组成部件,例如一个需要配置的汽车对象。抽象建造者(Builder):一个接口,定义了构建产品各个部件的方法。具体建造者(ConcreteBuilde......
  • Java学设计模式之桥接模式
    一、桥接模式概念1.1什么是桥接模式桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过将抽象部分和实现部分分离来解决多维度变化的问题,从而提高了系统的灵活性和可扩展性。结构桥接模式通常由以下几个部分组成:Abstraction(抽象类......