C++版设计模式简介 与 初识 工厂模式

前言

  关于并发编程的更多内容我会在后续的实际开发中进行总结,然后分享给大家!接下来将会和大家一起学习C++的设计模式😷

一、设计模式简介

1. 什么是设计模式

  (1)设计模式 是 软件开发人员在软件开发过程中 面临的 一般问题的解决方案。

  (2)这些解决方案是众多软件开发人员经过 相当长的一段时间的 试验 和 错误总结出来的。

  (3)使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

2. 设计模式分类

  设计模式提供了一种标准化的方法来处理软件设计中的问题,使得代码更加灵活、可维护和可重用。它们通常是在特定的上下文中应用,并在软件开发的不同阶段(如设计、编码、测试等)起到指导作用。

  设计模式有23种左右。设计模式一般分为以下几类:

  1. 创建型模式(Creational Patterns):这些模式关注对象的创建过程,旨在将对象的创建与使用分离。常见的创建型模式包括(常用的是前三种):

    • 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。
    • 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,但由子类决定要实例化的类。
    • 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或互相依赖对象的接口,而无需指定具体类。
    • 建造者模式(Builder Pattern):通过将一个复杂对象的构建过程与它的表示分离,来构建一个复杂对象。
    • 原型模式(Prototype Pattern):通过复制现有的实例来创建新实例,而不是通过构造函数。
  2. 结构型模式(Structural Patterns):这些模式关注类和对象的组合,帮助确保系统中的组件可以组合成更复杂的结构。常见的结构型模式包括:

    • 适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一种接口。
    • 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们可以独立变化。
    • 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。
    • 外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面,使子系统更易使用。
    • 享元模式(Flyweight Pattern):通过共享大量细粒度的对象来有效地支持大量的对象。
    • 组合模式(Composite Pattern):将对象组合成树形结构以表示部分-整体层次结构。
  3. 行为型模式(Behavioral Patterns):这些模式关注对象之间的交互和职责分配。关注对象之间的通信,譬如将行为、数据、展示拆分又互相通信的MVC架构,经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。
    常见的行为型模式包括:

    • 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并使它们可以互相替换。
    • 观察者模式(Observer Pattern):定义对象间一对多的依赖关系,以便当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。
    • 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个集合对象中的各个元素,而不暴露该对象的内部表示。
    • 模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
    • 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为。
    • 命令模式(Command Pattern):将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化、排队请求或记录请求日志。
    • 责任链模式(Chain of Responsibility Pattern):使多个对象有机会处理请求,从而避免请求发送者和接收者之间的耦合。

  框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。

  在软件生产中有三种级别的重用:(1)内部重用,即在同一应用中能公共使用的抽象块;(2)代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;(2)应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。

3. 设计模式的优点

  • 提高代码复用:通过模式化的解决方案,可以在不同的项目中重复使用相同的设计。
  • 提高代码灵活性:设计模式使系统具有更好的扩展性和灵活性,便于在需求变化时进行调整。
  • 促进团队合作:标准化的设计模式可以让团队成员更容易理解和维护代码,提高团队的沟通效率。
  • 简化设计过程:通过提供通用的解决方案,设计模式可以帮助开发人员解决复杂的设计问题。
  • 开发人员的共同平台:提供了一个标准的术语系统,且具体到特定的情景。例如,单例设计模式意味着使用单个对象,这样所有熟悉单例设计模式的开发人员都能使用单个对象,并且可以通过这种方式告诉对方,程序使用的是单例模式。
  • 最佳的实践:设计模式已经经历了很长一段时间的发展,它们提供了软件开发过程中面临的一般问题的最佳解决方案。学习这些模式有助于经验不足的开发人员通过一种简单快捷的方式来学习软件设计。

4. 设计模式的实践

  • 学习经典书籍:如《设计模式:可复用面向对象软件的基础》(Erich Gamma 等著),这是设计模式的经典参考书。
  • 应用到实际项目中:在实际项目中尝试应用设计模式,逐步理解其优势和适用场景。
  • 分析开源项目:阅读和分析开源项目的设计,了解如何在实际中应用设计模式。

  分享下个人的一些资料:《23种设计模式(C++完整版).pdf》,来自于网络,链接如下

链接:https://pan.baidu.com/s/1M2A9S6WKJ3_7BZipYd1SzQ 
提取码:ch3q 
--来自百度网盘超级会员V6的分享

  程杰《大话设计模式》一书,使用JAVA编写示例程序,但是会C++的话,是可以看懂这些例程的,面向对象的这些语法二者很相似,我是买了一本二手书进行学习的。安利一个买正版二手书的微信小程序《多抓鱼》,不是广告,单纯觉得好用分享给大家
在这里插入图片描述

二、单例模式

  单例模式(Singleton Pattern)是一种设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。它通常用于需要全局唯一实例的场景,比如数据库连接池、配置管理器等。

1. 单例模式的关键点

  • 唯一性: 确保类只有一个实例。
  • 全局访问: 提供全局访问点来获取该实例。
  • 延迟初始化: (可选)在第一次使用时才创建实例。

2. 单例模式的实现方式

  单例模式有多种实现方式,下面列出了几种常见的方法。

饿汉式单例(Eager Initialization)

  特点: 类加载时即创建实例,不管是否使用。简单且线程安全,但可能导致资源浪费。

class Singleton {
   
   
public:
    static Singleton* getInstance() {
   
   
        return instance;
    }

private:
    Singleton() {
   
   }
    static Singleton* instance;
};

// 类加载时即创建实例
Singleton* Singleton::instance = new Singleton();

懒汉式单例(Lazy Initialization)

  特点: 在第一次使用时创建实例。需要注意线程安全问题。

class Singleton {
   
   
public:
    static Singleton* getInstance() {
   
   
        if (instance == nullptr) {
   
   
            instance = new Singleton();
        }
        return instance;
    }

private:
    Singleton() {
   
   }
    static Singleton* instance;
};

// 类外定义静态成员
Singleton* Singleton::instance = nullptr;

双重检查锁定(Double-Checked Locking)

  特点: 在懒汉式基础上加锁,避免了多线程环境下的同步开销。

#include <mutex>

class Singleton {
   
   
public:
    static Singleton* getInstance() {
   
   
        if (instance == nullptr) {
   
   
            std::lock_guard<std::mutex> lock(mutex);
            if (instance == nullptr) {
   
   
                instance = new Singleton();
            }
        }
        return instance;
    }

private:
    Singleton() {
   
   }
    static Singleton* instance;
    static std::mutex mutex;
};

// 类外定义静态成员
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;

登记式单例(Registry-based Singleton)

  特点: 使用静态成员注册实例,避免了静态初始化顺序问题,但有额外的复杂性。

#include <map>
#include <string>

class Singleton {
   
   
public:
    static Singleton* getInstance(const std::string& name) {
   
   
        if (instances.find(name) == instances.end()) {
   
   
            instances[name] = new Singleton();
        }
        return instances[name];
    }

private:
    Singleton() {
   
   }
    static std::map<std::string, Singleton*> instances;
};

// 类外定义静态成员
std::map<std::string, Singleton*> Singleton::instances;

枚举式单例(Enum-based Singleton)

  特点: 使用枚举类创建单例,线程安全且简单,但不支持延迟初始化。

#include <iostream>

class Singleton {
   
   
public:
    // 获取单例实例
    static Singleton& getInstance() {
   
   
        return instance;
    }

    // 示例方法
    void showMessage() const {
   
   
        std::cout << "Hello, Singleton!" << std::endl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小嵌同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值