• C++单例模式与工厂模式


    一、单例模式

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

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

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

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

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

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

    1.饿汉式

    1. class Singleton {
    2. private:
    3. static Singleton instance;
    4. Singleton() {}
    5. public:
    6. static Singleton& GetInstance() {
    7. return instance;
    8. }
    9. void print() {
    10. cout << "123" << endl;
    11. }
    12. int i=1;
    13. };
    14. Singleton Singleton::instance;//类中声明,类外定义
    15. int main()
    16. {
    17. Singleton::GetInstance().print();
    18. cout << Singleton::GetInstance().i << endl;
    19. return 0;
    20. }

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

    2.懒汉式

    1. class Singleton {
    2. private:
    3. Singleton() {}
    4. public:
    5. static Singleton& GetInstance() {
    6. static Singleton instance;
    7. return instance;
    8. }
    9. void print() {
    10. cout << "123" << endl;
    11. }
    12. int i = 0;
    13. };
    14. int main()
    15. {
    16. Singleton::GetInstance().print();
    17. cout << Singleton::GetInstance().i << endl;
    18. return 0;
    19. }

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

    3.注册式单例

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

    1. template<typename T>
    2. class SingletonBase {
    3. protected:
    4. //得声明为protected
    5. SingletonBase(){}
    6. public:
    7. static T& GetInstance() {
    8. static T instance;
    9. return instance;
    10. }
    11. };
    12. class Foo :public SingletonBase {
    13. private:
    14. public:
    15. static void print() {
    16. cout << "123" << endl;
    17. }
    18. };
    19. int main()
    20. {
    21. Foo::GetInstance().print();
    22. }

    4.补充

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

    C#当中弱化了全局变量的声明与定义的概念,用C#写单例也相对简单的多

    二、工厂模式

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

    参考自:

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

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

    1.简单工厂

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

    2)代码

    1. class ItemBase {//抽象产品类
    2. public:
    3. virtual void ItemName() = 0;
    4. virtual ~ItemBase() {};//声明析构函数为虚函数,防止内存泄漏
    5. };
    6. class ItemA :public ItemBase {//具体产品类A
    7. public:
    8. void ItemName() override{
    9. cout << "ItemA" << endl;
    10. }
    11. };
    12. class ItemB :public ItemBase {//具体产品类B
    13. public:
    14. void ItemName() override {
    15. cout << "ItemB" << endl;
    16. }
    17. };
    18. class ItemFactory {//简单工厂类
    19. public:
    20. ItemBase* CreateItem(bool ItemTypeIsA) {
    21. switch (ItemTypeIsA) {
    22. case 1:
    23. return new ItemA();
    24. default:
    25. return new ItemB();
    26. }
    27. }
    28. };
    29. int main()
    30. {
    31. ItemFactory itemFactory;
    32. ItemBase* itemA = itemFactory.CreateItem(1);
    33. itemA->ItemName();
    34. ItemBase* itemB = itemFactory.CreateItem(0);
    35. itemB->ItemName();
    36. }

    2.工厂方法

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

    2)代码

    1. class ItemBase {//抽象产品基类
    2. public:
    3. virtual void ItemName() = 0;
    4. virtual ~ItemBase() {};//声明析构函数为虚函数,防止内存泄漏
    5. };
    6. class ItemA :public ItemBase {//具体产品类A
    7. public:
    8. void ItemName() override{
    9. cout << "ItemA" << endl;
    10. }
    11. };
    12. class ItemB :public ItemBase {//具体产品类B
    13. public:
    14. void ItemName() override {
    15. cout << "ItemB" << endl;
    16. }
    17. };
    18. class ItemFactoryBase {//抽象工厂基类
    19. public:
    20. virtual ItemBase* CreateItem() = 0;
    21. virtual ~ItemFactoryBase() {};
    22. };
    23. class ItemAFactory :public ItemFactoryBase {//具体工厂类A
    24. public :
    25. ItemBase* CreateItem()override {
    26. return new ItemA();
    27. }
    28. };
    29. class ItemBFactory :public ItemFactoryBase {//具体工厂类B
    30. public:
    31. ItemBase* CreateItem()override {
    32. return new ItemB();
    33. }
    34. };
    35. int main()
    36. {
    37. ItemFactoryBase* itemAFactory = new ItemAFactory();
    38. ItemBase* itemA = itemAFactory->CreateItem();
    39. itemA->ItemName();
    40. ItemFactoryBase* itemBFactory = new ItemBFactory();
    41. ItemBase* itemB=itemBFactory->CreateItem();
    42. itemB->ItemName();
    43. }

    3.抽象工厂

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

    2)代码

    1. class ShoesBase {//鞋子抽象类
    2. public:
    3. virtual void ShoesName() = 0;
    4. virtual ~ShoesBase() {};//声明析构函数为虚函数,防止内存泄漏
    5. };
    6. class ShoesA :public ShoesBase {//具体产品类--鞋子A
    7. public:
    8. void ShoesName() override{
    9. cout << "ShoesA" << endl;
    10. }
    11. };
    12. class ShoesB :public ShoesBase {//具体产品类--鞋子B
    13. public:
    14. void ShoesName() override {
    15. cout << "ShoesB" << endl;
    16. }
    17. };
    18. class HatBase {//帽子抽象类
    19. public:
    20. virtual void HatName() = 0;
    21. virtual ~HatBase() {};//声明析构函数为虚函数,防止内存泄漏
    22. };
    23. class HatA :public HatBase {//具体产品类--帽子A
    24. public:
    25. void HatName() override {
    26. cout << "HatA" << endl;
    27. }
    28. };
    29. class HatB :public HatBase {//具体产品类--帽子B
    30. public:
    31. void HatName() override {
    32. cout << "HatB" << endl;
    33. }
    34. };
    35. class FactoryBase {//抽象工厂类,可生产多种产品
    36. public:
    37. virtual ShoesBase* CreateShoes() = 0;
    38. virtual HatBase* CreateHat() = 0;
    39. virtual ~FactoryBase() {};
    40. };
    41. class AFactory :public FactoryBase {//具体工厂类A,可生成所有的A类型的产品
    42. public :
    43. ShoesBase* CreateShoes()override {
    44. return new ShoesA();
    45. }
    46. HatBase* CreateHat()override {
    47. return new HatA();
    48. }
    49. };
    50. class BFactory :public FactoryBase {//具体工厂类B,可生成所有的B类型的产品
    51. public:
    52. ShoesBase* CreateShoes()override {
    53. return new ShoesB();
    54. }
    55. HatBase* CreateHat()override {
    56. return new HatB();
    57. }
    58. };
    59. int main()
    60. {
    61. FactoryBase* aFactory = new AFactory();//创建A类工厂
    62. ShoesBase* shoesA = aFactory->CreateShoes();
    63. shoesA->ShoesName();
    64. HatBase* hatA = aFactory->CreateHat();
    65. hatA->HatName();
    66. FactoryBase* bFactory = new BFactory();//创建B类工厂
    67. ShoesBase* shoesB = bFactory->CreateShoes();
    68. shoesB->ShoesName();
    69. HatBase* hatB = bFactory->CreateHat();
    70. hatB->HatName();
    71. }

  • 相关阅读:
    解决Pyinstaller打包文件太大的办法(绝对有效,亲测!!!)
    SAR/毫米波雷达 论文阅读 | Freehand, Agile, and High-Resolution Imaging, IEEE Access 2019
    一次POST调用,响应结果乱码问题排查(2)
    Node.js如何处理多个请求?
    vite+vue集成cesium
    开源OA协同办公系统,集成Flowable流程引擎 可拖拽创建个性表单
    [附源码]java毕业设计静谧空间自习室预订系统
    力扣(LeetCode)2095. 删除链表的中间节点(C++)
    现在进行时习题
    2023年的低代码:数字化、人工智能、趋势及未来展望
  • 原文地址:https://blog.csdn.net/qq_42987967/article/details/126079577