一、单例模式

理解C++单例模式之前,需要

参考自:C++ 静态成员变量_Little_XWB的博客-CSDN博客_c++静态成员变量

C++如何实现单例模式?_Tattoo_Welkin的博客-CSDN博客_单例模式c++实现

C++实现单例的5种方法总结_zztan的博客-CSDN博客_c++ 单例

C++类的单例模式_night boss的博客-CSDN博客_c++单例模式

C++如何用虚继承实现单例? - 知乎

1.饿汉式

class Singleton {
private:static Singleton instance;Singleton() {}
public:static Singleton& GetInstance() {return instance;} void print() {cout << "123" << endl;}int i=1;};
Singleton Singleton::instance;//类中声明,类外定义
int main()
{Singleton::GetInstance().print();cout << Singleton::GetInstance().i << endl;return 0;
}

饿汉式在编译时便将静态对象放到全局区了。

2.懒汉式

class Singleton {
private:Singleton() {}
public:static Singleton& GetInstance() {static Singleton instance;return instance;}void print() {cout << "123" << endl;}int i = 0;
};
int main()
{Singleton::GetInstance().print();cout << Singleton::GetInstance().i << endl;return 0;
}

在这懒汉式用的是静态局部变量的方法,充分使用了静态局部变量的特点。当然也可以使用new的方式,就是比较麻烦得记得delete。

3.注册式单例

这个比较复杂些,是一种可继承的单例,需要用到模板

template<typename T>
class SingletonBase {
protected://得声明为protectedSingletonBase(){}
public:static T& GetInstance() {static T instance;return instance;}
};
class Foo :public SingletonBase<Foo> {
private:public:static void print() {cout << "123" << endl;}
};
int main()
{Foo::GetInstance().print();
}

4.多线程下的单例

参考自:多线程下的单例模式详解_若曦`的博客-CSDN博客_多线程单例模式

C++多线程单例模式_koko_TT的博客-CSDN博客_c++ 单例模式 多线程

采用加锁双重判断:

#include <mutex>
using namespace std;class Singleton {
public:static Singleton* GetInstance() {if (!instance) {lock_guard<mutex> lck(mtx);if (!instance) {instance = new Singleton();}}return instance;}int i = 0;void print() {cout << "123" << endl;}
private:static Singleton* instance;static mutex mtx;Singleton(){}
};
mutex Singleton::mtx;
Singleton* Singleton::instance;
int main() {Singleton::GetInstance()->print();cout << Singleton::GetInstance()->i << endl;return 0;
}

5.补充

C#类型的单例模式可参考:c# 单例模式的实现

C# 多线程下的单例模式 - Tian_blog - 博客园

C#当中弱化了全局变量的声明与定义的概念,用C#写单例也相对简单的多,而且C#当中的锁相对C++当中的锁也方便一些,

二、工厂模式

工厂模式 中对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护。

参考自:

C++ 工厂模式解决什么问题? - 明明1109 - 博客园

C++实现工厂模式_herryone123的博客-CSDN博客_c++工厂模式

1.简单工厂

1)基本要素:抽象产品类、具体产品类、一个简单工厂类

2)代码

class ItemBase {//抽象产品类
public:virtual void ItemName() = 0;virtual ~ItemBase() {};//声明析构函数为虚函数,防止内存泄漏
};
class ItemA :public ItemBase {//具体产品类A
public:void  ItemName() override{cout << "ItemA" << endl;}
};
class ItemB :public ItemBase {//具体产品类B
public:void  ItemName() override {cout << "ItemB" << endl;}
};
class ItemFactory {//简单工厂类
public:ItemBase* CreateItem(bool ItemTypeIsA) {switch (ItemTypeIsA) {case 1:return new ItemA();default:return new ItemB();}}
};
int main()
{ItemFactory itemFactory;ItemBase* itemA = itemFactory.CreateItem(1);itemA->ItemName();ItemBase* itemB = itemFactory.CreateItem(0);itemB->ItemName();
}

2.工厂方法

1)基本要素:抽象产品类、具体产品类、抽象工厂类、具体工厂类。每个具体工厂只能生产一种具体的产品

2)代码

class ItemBase {//抽象产品基类
public:virtual void ItemName() = 0;virtual ~ItemBase() {};//声明析构函数为虚函数,防止内存泄漏
};
class ItemA :public ItemBase {//具体产品类A
public:void  ItemName() override{cout << "ItemA" << endl;}
};
class ItemB :public ItemBase {//具体产品类B
public:void  ItemName() override {cout << "ItemB" << endl;}
};class ItemFactoryBase {//抽象工厂基类
public:virtual ItemBase* CreateItem() = 0;virtual ~ItemFactoryBase() {};
};
class ItemAFactory :public ItemFactoryBase {//具体工厂类A
public :ItemBase* CreateItem()override {return new ItemA();}
};
class ItemBFactory :public ItemFactoryBase {//具体工厂类B
public:ItemBase* CreateItem()override {return new ItemB();}
};
int main()
{ItemFactoryBase* itemAFactory = new ItemAFactory();ItemBase* itemA = itemAFactory->CreateItem();itemA->ItemName();ItemFactoryBase* itemBFactory = new ItemBFactory();ItemBase* itemB=itemBFactory->CreateItem();itemB->ItemName();
}

3.抽象工厂

1)基本要素:抽象产品类、具体产品类、抽象工厂类、具体工厂类。一个具体的工厂可以生产多个具体产品。

2)代码

class ShoesBase {//鞋子抽象类
public:virtual void ShoesName() = 0;virtual ~ShoesBase() {};//声明析构函数为虚函数,防止内存泄漏
};
class ShoesA :public ShoesBase {//具体产品类--鞋子A
public:void  ShoesName() override{cout << "ShoesA" << endl;}
};
class ShoesB :public ShoesBase {//具体产品类--鞋子B
public:void  ShoesName() override {cout << "ShoesB" << endl;}
};class HatBase {//帽子抽象类
public:virtual void HatName() = 0;virtual ~HatBase() {};//声明析构函数为虚函数,防止内存泄漏
};
class HatA :public HatBase {//具体产品类--帽子A
public:void  HatName() override {cout << "HatA" << endl;}
};
class HatB :public HatBase {//具体产品类--帽子B
public:void  HatName() override {cout << "HatB" << endl;}
};class FactoryBase {//抽象工厂类,可生产多种产品
public:virtual ShoesBase* CreateShoes() = 0;virtual HatBase* CreateHat() = 0;virtual ~FactoryBase() {};
};
class AFactory :public FactoryBase {//具体工厂类A,可生成所有的A类型的产品
public :ShoesBase* CreateShoes()override {return new ShoesA();}HatBase* CreateHat()override {return new HatA();}
};
class BFactory :public FactoryBase {//具体工厂类B,可生成所有的B类型的产品
public:ShoesBase* CreateShoes()override {return new ShoesB();}HatBase* CreateHat()override {return new HatB();}
};
int main()
{FactoryBase* aFactory = new AFactory();//创建A类工厂ShoesBase* shoesA = aFactory->CreateShoes();shoesA->ShoesName();HatBase* hatA = aFactory->CreateHat();hatA->HatName();FactoryBase* bFactory = new BFactory();//创建B类工厂ShoesBase* shoesB = bFactory->CreateShoes();shoesB->ShoesName();HatBase* hatB = bFactory->CreateHat();hatB->HatName();
}

C++单例模式与工厂模式相关推荐

  1. 软件设计模式“单例模式”和“工厂模式”

    软件设计模式"单例模式"和"工厂模式" 单例模式 什么是单例模式 单例模式的实现方式有哪些 单例模式的优缺点 单例模式的应用场景 总结 工厂模式 什么是工厂模式 ...

  2. 创建型模式-单例模式、工厂模式

    目录 创建型模式特点 创建型模式分类 1.单例模式(Singleton Pattern) 单例介绍 代码演示 ①饿汉式(静态常量) ②饿汉式(静态代码块) ③懒汉式(线程不安全) ④懒汉式(线程安全, ...

  3. 设计模式——单例模式、工厂模式

    设计模式--单例模式.工厂模式 一.六大设计原则 开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热 ...

  4. java 工厂 单例_java 单例模式和工厂模式实例详解

    单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例. 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 饿汉式单例 public class ...

  5. 用最简单的例子说明设计模式(一)之单例模式、工厂模式、装饰模式、外观模式...

    设计模式 所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案).使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.设计模式使人们可以更加简单 ...

  6. 安卓中的单例模式和工厂模式

    单例模式 简单的来说,单例模式就是提供一个实例,并且提供一个全局的访问点. 适用场景:1.应用中某个实例对象需要频繁的被访问. 2.应用中每次启动只会存在一个实例. 优点:内存中只有一个实例,减少了内 ...

  7. 基本设计模式:单例模式和工厂模式代码实现

    单例模式 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点.通常我们可以让一个全局变量使得一个对象被访问,但它不能阻止你实例化多个对象.一个最好的办法是,让类自身负责保存它的唯一实例.这个 ...

  8. JAVA常用设计模式(一、单例模式、工厂模式)

    JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map;/*** 设计模式之单例模式* 单例模式(Singleton Pattern) ...

  9. iOS-事件响应链、单例模式、工厂模式、观察者模式

    欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary 一.iOS中事件传递和相应机制 iOS中 ...

  10. 一口气讲完设计模式(单例模式、工厂模式、原型模式、建造者模式、适配器、桥梁模式)

    设计模式 使用设计模式,可以让我们的代码具有更好的可读性.可扩展性.可读性.重用性.符合高内聚低耦合的特点.作为程序员,是我们经常听到的概念,也是我们程序员必须深入学习,了解的知识. 设计模式种类 该 ...

最新文章

  1. C语言再学习-- readelf、objdump、nm使用详解
  2. Python istitle() 方法
  3. 深入理解Spark 2.1 Core (十二):TimSort 的原理与源码分析
  4. Postman高级应用——流程控制、调试、公共函数、外部数据文件
  5. 2016/1/14 java随机数生成
  6. JavaSE02 数组的基本知识
  7. bzoj 1673: [Usaco2005 Dec]Scales 天平(DFS)
  8. PHP开源软件《个人管理系统》-希望大家一起来开发
  9. Linq级联删除 CascadingDeleteOnSubmit
  10. 计算机课题立项申报书范文,专项课题立项申报书模板.doc
  11. 微信小程序icon图标引入
  12. 红外遥控模块的使用方法,以及stm32代码
  13. 计算机几何 - 如何判断一个多边形是凸多边形还是凹多边形
  14. PCI Express 16X和PCIE 2.0有什么区别?哪个更好?
  15. 2022全国智慧医院建设大会会议通知
  16. 特征提取丨共空间模式 Common Spatial Pattern (CSP)
  17. source and destination ports as seperate columns in wireshark
  18. pytorch实现 vision_transformer
  19. 什么是注入式攻击,如何防止sql注入式攻击。
  20. 测试ai模糊软件,AE/PR人工智能自动人脸检测马赛克模糊插件

热门文章

  1. linux格式化磁盘出现资源忙,Linux 磁盘格式化、挂载
  2. 苹果/Mac电脑如何开启勿扰模式?
  3. 42个著名搜索引擎免费登陆入口大全
  4. POST的4种请求方式
  5. json转为html表格,将JSON转换为html表格
  6. 在OpenGL中实现Extrude 造型
  7. Jvm面试题及答案整理 271道,Jvm面试题大全带答案(2021最新版)
  8. Java中浅拷贝和深拷贝的区别
  9. 一篇奶妈级HTML学习笔记
  10. 如何在Schlage Connect Smart Lock上启用休假模式