单例设计模式

简介: 单例设计模式

什么是设计 模式

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

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

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

代码设计经验的总结。

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

单例设计模式

什么是单例设计模式

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

例如:

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.长时间不使用对象,导致系统回收掉


相关文章
|
6月前
|
设计模式
单例设计模式步骤
单例设计模式步骤
33 1
|
6月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
136 0
|
6月前
|
设计模式 安全 Java
最简单的设计模式是单例?
单例模式可以说是Java中最简单的设计模式,但同时也是技术面试中频率极高的面试题。因为它不仅涉及到设计模式,还包括了关于线程安全、内存模型、类加载等机制。所以说它是最简单的吗?
78 3
最简单的设计模式是单例?
|
6月前
|
设计模式 安全 Java
【设计模式】2、设计模式分类和单例设计模式
【设计模式】2、设计模式分类和单例设计模式
57 0
|
6月前
|
设计模式 消息中间件 安全
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(二)
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(二)
54 1
|
6月前
|
设计模式 Java
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
52 2
|
6月前
|
设计模式 安全 Java
在Java中即指单例设计模式
在Java中即指单例设计模式
39 0
|
2月前
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
设计模式——设计模式介绍和单例设计模式
|
3月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
47 1
|
6月前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

热门文章

最新文章