zoukankan      html  css  js  c++  java
  • [设计模式] 单例模式

    概述

    设计模式---- 单例模式

    • 这是一个创建型的设计模式

    • 它保证某一个类只会有一个实例,实际用途就是比如说我要写一个全局的配置类,或者数据库操作类,全局可能都会访问到,但是需要保证信息同步。

    • 而在使用这种设计模式之前,我的解决方案就是通过继承的方式解决,或者大量的全局静态变量,尤其是后者,实际上并不太好用。

    原理

    • 通过将构造函数设置为private的方式,使得不能通过new创建实例
    • 创建实例则是通过创建一个公开的函数获取实例,并且保存到类中的一个静态变量当中
      • 如果已经实例化一次,则直接返回实例化的对象
      • 如果是第一个实例化,则使用new创建对象,并且保存对象指针到静态变量中

    详解:https://refactoringguru.cn/design-patterns/singleton

    Show Code

    #include <iostream>
    
    using namespace std;
    
    // singleton
    class singleton
    {
    
    private:
    	singleton();
    	~singleton();
    	static singleton* instance;	// 对象指针是静态的
    	int var1 = 10;
    
    public:
    	static singleton* getInstance();	// 获取对象的函数也是静态的
    	int var();		// 获取器
    	void var(int);	// 重载_设置器
    };
    
    singleton *singleton::instance = nullptr;	// 类中的静态变量一定要初始化
    singleton::~singleton()	// 析构函数实现
    {
    }
    
    singleton::singleton()	// 构造函数也一定要实现
    {
    
    }
    
    singleton* singleton::getInstance()	// 实现部分不需要静态关键字static
    {
    	if (instance == NULL)
    	{
    		instance = new singleton();
    		return instance;
    	}
    	return instance;
    }
    
    int singleton::var()
    {
    	return var1;
    }
    
    void singleton::var(int v)
    {
    	var1 = v;
    }
    
    int main()
    {
    	singleton* ins= singleton::getInstance();
    	ins->var(15);
    
    	singleton* ins2 = singleton::getInstance();
    	cout << ins2->var() << endl;	// 输出是15而不是10
    	return 0;
    }
    

    我总是忘记初始化类中的静态变量,这会导致vs出现无法解析的符号错误
    LNK2019 无法解析的外部符号 "private: __thiscall singleton::singleton(void)" (??0singleton@@AAE@XZ),该符号在函数 "public: static class singleton * __cdecl singleton::getInstance(void)" (?getInstance@singleton@@SAPAV1@XZ) 中被引用

    最终,运行的结果是15而不是10,即使这是一个“新的对象”(实际上还是原来那个)

  • 相关阅读:
    索引器
    拆箱,装箱,枚举,结构
    题解报告(CDUT暑期集训——第二场)
    题解报告(CDUT暑期集训——第一场)
    第十一届四川省程序设计竞赛赛后感(电科两日游
    ZOJ4108 Fibonacci in the Pocket
    ZOJ4107 Singing Everywhere
    ZOJ4106 Lucky 7 in the Pocket
    ZOJ4105 Abbreviation
    ZOJ4104 Sequence in the Pocket
  • 原文地址:https://www.cnblogs.com/cjdty/p/12900896.html
Copyright © 2011-2022 走看看