首页 > 其他分享 >单例模式

单例模式

时间:2022-08-19 19:23:26浏览次数:55  
标签:get int void 模式 RealSingleton 单例 data 构造函数

c++的设计模式:

1 单例模式(Singleton Pattern)

单例模式:是最简单的设计模式之一。但是确实很有用的设计模式,因为很多时候,在同一个系统中,我们希望某个类在创建对象的时候,只能创建一个,比如日志对象,数据库连接池对象,读写文件的对象等。

往往这些对象都功能比较简单,重复的做同一个功能。

 分析实现

1 该对象创建在栈空间中---------------> 不行,因为当结束之后,会被自动进行释放,所以不可取。

2 在堆中进行创建,由程序员自己手动进行创建。(可行) 可以查看下面的扩展更好理解一点

其实理解了如何只生成堆对象之后,这个就是水到渠成的

具体的实现,(使用裸露的单例模式其实是不合理的,因为在释放的时候,基本上一定会报错,要写一个自己释放的函数)

class RealSingleton{
public:
   static RealSingleton* get_instance(int data);       // 这个的参数就是构造函数的参数,这个现在就是构造函数
   int get_data() const;
   void set_data(int data);
   ~RealSingleton();
private:
   RealSingleton(int data);                    // 所有的参数的传递都是不影响的
private:
   int _data;
   static RealSingleton *pinstance;
};

// 执行过程
void test4()
{
   RealSingleton *p1 = RealSingleton::get_instance(123456);
   cout << "p1's address : " << (void *)p1 << endl;
   cout << "p1->data : " << p1->get_data() << endl;

   RealSingleton *p2 = RealSingleton::get_instance(987654);
   cout << "p2's address : " << (void *)p2 << endl;
   cout << "p2->data : " << p2->get_data() << endl;

   delete p1;
   delete p2;            // 当delete两次的时候是会出问题的,所以不行
}
结果:
RealSingleton(int)
p1's address : 0x557cabaf52e0
p1->data : 123456
p2's address : 0x557cabaf52e0
p2->data : 123456
[1]    1937361 segmentation fault (core dumped) ./a.out          // 已经产生了coredump,所以不能

 

class RealSingleton{
public:
   static RealSingleton* get_instance(int data);       // 这个的参数就是构造函数的参数,这个现在就是构造函数
   int get_data() const;
   void set_data(int data);
   static void release_instance();                    // 手动进行释放即可
private:
   RealSingleton(int data);                           // 所有的参数的传递都是不影响的
   ~RealSingleton();
private:
   int _data;
   static RealSingleton *pinstance;
};

 

扩展:

1 创建一个类,只能在栈上创建对象

分析:其实这个和好实现的,只要将operator new 或者是 operator delete删除掉即可/或者是设置为private也可以

void *operator new(std::size_t size) = delete;
void operator delete(void *p) = delete;

例子:
class SingletonStack{                                                                                                                                
public:
   SingletonStack(int data = 1000);
   ~SingletonStack();
   void setData(int data);
   int getData();
   void *operator new(std::size_t size) = delete;
private:
   int _data;
};

 

2 创建一个类,只能在堆上创建对象

分析:如果只生成堆上的对象,那么可以将构造函数搞成私有的,这样就可以实现不能在栈上创建对象了

但是这个时候,堆上也是不能进行创建的,因为堆上创建对象的时候,也是需要构造函数的,所以要重新写一个函数来实现获取这个对象

class SingletonHeap{                                                                                                                                                                        
public:
   void setData(int data);
   int getData()const;
   ~SingletonHeap();
   static SingletonHeap *get_heap_singleton(int data);        // 此时这个函数就相当于是构造函数了,构造函数需要的一                                                               // 切参数都是通过该函数来进行传递的
private:
   SingletonHeap(int data = 10000);
private:
   int _data;
};

 

扩展2 

后面可以写一下,RAII技术,结合智能指针来进行一下实现,其实真的这些知识点都是一串一串的

标签:get,int,void,模式,RealSingleton,单例,data,构造函数
From: https://www.cnblogs.com/moxianbaolianxisheng/p/16603098.html

相关文章

  • 【建议收藏】Mac VMWare NAT模式安装 CentOS 7-操作教程
    学习大数据离不开Linux系统,网络上大部分文章都是在Windows系统下使用VMWareWorkstation安装CentOS,并使用NAT模式配置网络。本文基于MacOS,通过VMWareFusion......
  • spark程序如何在不同的安装模式下运行
    1.本地spark-submit--classorg.apache.spark.examples.SparkPi--masterlocal[2]/opt/app/spark-2.3.1/examples/jars/spark-examples_2.11-2.3.1.jar1002.standa......
  • 适配器的应用(泛型模式)
    适配器模式是一种重要的设计模式,能让代码简练。直接上代码。定义接口,如下所示:publicinterfaceIOrderOperate<C,U,D>{/***创建单据*/boolea......
  • 设计模式-单例模式
    单例模式:简单地说就是一个实例即一个对象,全局只用这一个对象。如何保证一个对象呐?私有的构造函数,保证外界不能直接new一个对象,那么就保证了单一性;但......
  • java中23种设计模式
    一、设计模式分类1.设计模式分类  2.设计模式特点单例模式:某个类只能有一个实例,提供一个全局的访问点。简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类......
  • windows自动切换深色模式(夜晚模式)
    windows系统上怎么根据日出日落时间判断切换为深色模式或浅色模式呢?windows系统自带了一个叫做“任务计划程序”的软件。可以通过“开始菜单”中的搜索找到。然后选择“......
  • 心智模式
    人不是被事物本身困扰,而是被关于他们的意见所困扰。人的情绪、思维和行动是一体的。推动人自我发展的内在动机:安全感、自主性和胜任感。 积极的成长型思维:安全感......
  • Servlet特性研究之异步模式
    Servlet只有同步模型是怎样的?异步处理是Servlet3.0版本的重要功能之一,分析异步处理模型之前,先看看同步处理的过程是怎样的:客户端发起HTTP请求一个动态ServletAPI,请求......
  • .NET 异步编程模式 (四)-TAP
    TAP是基于任务的异步模式,在.NETFramework4中引入。TAP取代了APM和EAP,是推荐的异步编程模式。async/awaitasync和await是为异步编程提供的语法糖,方便我们快捷......
  • 报价模式的采购销售模式erp项目系统逻辑和数据库设计
    2022年8月10日13:56:22传统的电商模式和报价模式对比报价模式是先报价,在去采购对应的产品或者原料,在入库,出库给购买人,顺序不同,导致整个数据库接口不同举个例子在有色金......