设计模式六大原则和单例模式

设计模式

目的

实现可重用解决方案,构筑易维护、可扩展的软件系统。

六大原则

单一职责: 类的职责单一,一个方法做一件事。

开闭原则: 拓展开放,修改关闭。

里氏替换: 父类能出现的地方,子类可以替换。子类必须全部实现父类方法,尽量不暴露自己public方法供外界使用。覆盖或实现父类方法时,输入参数可以多。

依赖倒置: 模块之间的依赖通过抽象发生,具体类之间不依赖。每个类尽量有抽象类,任何类不应该从具体类派生,尽量不重写基类方法。

迪米特法则: 尽量减少对象间交互,从而减少类间耦合。

接口隔离原则: 类间的依赖关系建立在最小的接口上。

抽象构建框架,实现拓展细节。

单例模式

一个类只有一个对象,及系统中只有一个实例,实例被所有程序模块共享。

例如服务器配置信息放在一个文件中,配置数据由单例对象统一读取,服务进程的其他对象通过单例对象获取配置信息。

实现

有饿汉模式和懒汉模式两种实现模式。

饿汉模式

程序启动就创建唯一实例对象。

多线程获取单例对象不需要加锁。

cpp 复制代码
#include <iostream>
#include <string>

class Singleton {
private:
    // 私有构造函数,防止外部创建实例
    Singleton() : data("Singleton") {
        std::cout << "Singleton instance created!" << std::endl;
    }

    // 私有析构函数,防止外部删除实例
    ~Singleton() {}

    // 删除拷贝构造函数和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    // 静态成员变量,类加载时初始化
    static Singleton instance;

    // 成员变量
    std::string data;

public:
    // 获取单例对象的静态方法
    static Singleton& getInstance() {
        return instance;
    }

    // 获取成员变量的方法
    std::string& getData() {
        return data;
    }
};

// 在类外初始化静态成员变量
Singleton Singleton::instance;

int main() {
    // 获取单例对象
    Singleton& singleton = Singleton::getInstance();

    // 访问单例对象的成员变量
    std::cout << "Data: " << singleton.getData() << std::endl;

    // 再次获取单例对象,验证是否为同一个实例
    Singleton& singleton2 = Singleton::getInstance();
    if (&singleton == &singleton2) {
        std::cout << "Both references point to the same instance!" << std::endl;
    }

    return 0;
}

懒汉模式

如果单例对象构造特别耗时或者耗资(加载插件、网络),可在第一次使用时才创建对象。

C++11 之后,局部静态变量的初始化是线程安全的,因此可以直接使用局部静态变量实现懒汉模式

cpp 复制代码
#include <iostream>
#include <string>

class Singleton {
private:
    // 私有构造函数,防止外部创建实例
    Singleton() : data("Singleton") {
        std::cout << "Singleton instance created!" << std::endl;
    }

    // 私有析构函数,防止外部删除实例
    ~Singleton() {}

    // 删除拷贝构造函数和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    // 成员变量
    std::string data;

public:
    // 获取单例对象的静态方法
    static Singleton& getInstance() {
        static Singleton instance;  // 局部静态变量,线程安全
        return instance;
    }

    // 获取成员变量的方法
    std::string& getData() {
        return data;
    }
};

int main() {
    // 获取单例对象
    Singleton& singleton = Singleton::getInstance();

    // 访问单例对象的成员变量
    std::cout << "Data: " << singleton.getData() << std::endl;

    // 再次获取单例对象,验证是否为同一个实例
    Singleton& singleton2 = Singleton::getInstance();
    if (&singleton == &singleton2) {
        std::cout << "Both references point to the same instance!" << std::endl;
    }

    return 0;
}

推荐一下

https://github.com/0voice

相关推荐
七月丶6 小时前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞6 小时前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼6 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟1 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder1 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室1 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式