单例设计模式

简介: 单例设计模式

什么是设计 模式

模式:套路 -----> 写代码的习惯

设计模式:前人总结具有代表性套路的模式

官方说法:它是一套被反复使用,多数人知晓,经过分类编目的,

代码设计经验的总结。

设计模式的究极目标:通过增加的形式去减少因为变化而要修改源码的问题(维护问题)

单例设计模式

什么是单例设计模式

保证整个类的使用只有一个对象

例如:

1.多线程网络资源初始化

2.回收站机制

3.任务管理器

4.日志管理

如何实现单例设计模式

1.构造函数私有化

2.提供一个全局的静态方法,访问唯一对象

3.类中定义一个静态指针,指向唯一对象

单例设计模式的实现

有2种方式

1.懒汉式

2.饿汉式

懒汉式

在类中创建一个对象

//单例设计模式
#include<iostream>
#include<string>
using namespace std;
class singleton
{
public:
  //类中定义一个静态指针,指向唯一对象
  static singleton* m_singleton;
  //提供一个全局的静态方法,访问唯一对象
  static singleton* get()
  {
    if (m_singleton == NULL)
    {
      m_singleton = new singleton;
      return m_singleton;
    }
  }
private:
  singleton() 
  {
    cout << "构造对象" << endl;
    m_singleton = nullptr;
  }
};
singleton* singleton :: m_singleton = nullptr;  //静态成员需要类外初始化
int main()
{
  singleton* p1 = singleton::get();  //静态成员的访问,不需要对象,但是要加类名限定
  cout << "p1 = " << p1 << endl;
  singleton* p2 = singleton::get();
  cout << "p2 = " << p2 << endl;
  singleton* p3 = singleton::get();
  cout << "p3 = " << p3 << endl;
  return 0;
}

如果所示,p2与p3的地址是一样的,单例设计模式只有唯一的一个对象

但其实按理说我觉得3个的地址都应该一样
可能是我写错了,或者说对这单例设计模式还有不知道的细节,先暂时就这样

饿汉式

饥不择食,不管用不用,在全局中创建一个对象

饿汉式跟懒汉式的代码区别不大

#include<iostream>
#include<string>
using namespace std;
class singleton
{
public:
  //类中定义一个静态指针,指向唯一对象
  static singleton* m_singleton;
  //提供一个全局的静态方法,访问唯一对象
  static singleton* get()
  {
    return m_singleton;
  }
private:
  singleton()
  {
    cout << "构造对象" << endl;
    m_singleton = nullptr;
  }
};
singleton* singleton::m_singleton = new singleton;
int main()
{
  singleton* p1 = singleton::get();  //静态成员的访问,不需要对象,但是要加类名限定
  cout << "p1 = " << p1 << endl;
  singleton* p2 = singleton::get();
  cout << "p2 = " << p2 << endl;
  singleton* p3 = singleton::get();
  cout << "p3 = " << p3 << endl;
  return 0;
}

当然这里饿汉式就正常了,三个地址一样,说明单例设计模式,只能有一个唯一对象

单例设计模式的优缺点

优点:

1.内存只有一个对象,节省内存空间

2.避免频繁创建和销毁对象,提高性能

3.避免对共享的资源多重占用,简化访问

缺点:

1.不适合变化频繁的对象

2.长时间不使用对象,导致系统回收掉


相关文章
|
2月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
66 0
|
2月前
|
设计模式 缓存 安全
单例设计模式的优缺点
单例设计模式的优缺点
33 0
|
2月前
|
设计模式 XML 存储
关于 ABAP 单例设计模式的一个冷门知识点
关于 ABAP 单例设计模式的一个冷门知识点
23 0
|
2月前
|
设计模式 安全 Java
【设计模式】2、设计模式分类和单例设计模式
【设计模式】2、设计模式分类和单例设计模式
28 0
|
2月前
|
设计模式 Java
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
30 2
|
4月前
|
设计模式 消息中间件 安全
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(二)
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(二)
35 1
|
4月前
|
设计模式 安全 Java
最简单的设计模式是单例?
单例模式可以说是Java中最简单的设计模式,但同时也是技术面试中频率极高的面试题。因为它不仅涉及到设计模式,还包括了关于线程安全、内存模型、类加载等机制。所以说它是最简单的吗?
57 3
最简单的设计模式是单例?
|
2月前
|
设计模式 安全 Java
在Java中即指单例设计模式
在Java中即指单例设计模式
22 0
|
6月前
|
设计模式 存储
static应用之 单例设计模式(饿汉单例&懒汉单例)
本章我们来学习单例模式中的饿汉单例和懒汉单例,那么什么是单例模式呢?应用该模式的这个类永远只有一个实列,即一个类只能创建一个对象例如电脑上的任务管理器对象只需要一个就能解决问题,可以节省内存空间先定义一个类,把构造器私有如下图,先来看一下没有把构造器私有化的SingleInstance类,此时Test类中可以随意创建多个SingleInstance的实例化。 在SingleInstance类中用private修饰无参构造器,此时左边new方法报错了。我们在右边创建一个静态变量来存储对象,变量名为instan
27 0
|
14天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式