创建型 单例模式

简介: 创建型 单例模式

单例模式(Singleton Pattern): 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式

1:什么是单例

我的理解:在程序运行期间,只构造一个实例,所有的使用都共享使用该实例。

单例模式(Singleton Pattern): 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2:如何实现单例

单例的特性:

1:全局唯一的对象 ==》用static成员变量或者作用域特性实现

2:不允许用户去构造 ==》禁用构造函数,但是要保证自己能调用

3:只提供相应的接口,不允许用户修改 ==》禁用相关的拷贝构造等

4:多线程要安全,资源的释放 ==》加锁,同一作用域static对象释放在程序运行结束时调用对应的析构函数

利用static特性,实现单例模式.
  1:静态成员为所有对象共享,不属于某个单个实例
  2:静态成员必须在类外定义,不需要加static,声明时已经加过
  3:类静态成员即可用类名::静态成员或者对象.静态成员来访问
  4:静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5:静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

单例的实现主要依赖static的特性实现!!!

3:编码实现

在栈上控制内存的申请与释放,借助static特性(所有对象共享,不属于某个实例),实现懒汉和饿汉两种模式的单例

饿汉:

#include <iostream>
using namespace std;
class Singleton{
private:
  Singleton() = default;
  Singleton(const Singleton & s) = delete;
  Singleton &operator = (const Singleton &s) = delete;
  ~Singleton(){};
private:
  static Singleton m_sig;
public:
  static Singleton * GetInstence()
  {
    return &m_sig;
  }
  void Print()
  {
    cout<<"Singleton Instence\n ";
  }
};
Singleton Singleton::m_sig; //饿汉
int main()
{
  Singleton::GetInstence()->Print();
  return 0;
}

懒汉: static为整个类服务,而不是某个对象,只初始化一次,而且生命周期延长到整个程序运行结束才释放,全局数据区分配内存

修饰全局变量时,只能在本文件访问

#include <iostream>
using namespace std;
class Singleton{
private:
  Singleton() = default;
  Singleton(const Singleton & s) = delete;
  Singleton &operator = (const Singleton &s) = delete;
  ~Singleton(){};
public:
  static Singleton * GetInstence() //调用这个函数的时候static生效了
  {
    static Singleton m_sig;
    return &m_sig;
  }
  void Print()
  {
    cout<<"Singleton Instence\n ";
  }
};
int main()
{
  Singleton::GetInstence()->Print();
  return 0;
}

可以利用static的特性,栈上保存对应的堆内存的地址,借用static的特性和C++析构函数的特性,实现在程序终止的时候,自动释放堆上申请的内存,相关的实现如下:

如下代码,借助static管理堆内存,但明显发现,new出来的资源是没有释放的,

#include <iostream>
#include <mutex>
using namespace std;
class Singleton{
private:
  Singleton() = default;
  Singleton(const Singleton & s) = delete;
  Singleton &operator = (const Singleton &s) = delete;
  ~Singleton(){};
public:
  //对静态成员操作,所以控制成static
  static Singleton * GetInstence()
  {
    if(Singleton::m_sig_instance == NULL)
    {
      m_mutex.lock();
      if(Singleton::m_sig_instance == NULL)
      {
        m_sig_instance = new Singleton();
      }
      m_mutex.unlock();
    }
  }
  void Print()
  {
    cout<<"Singleton Instence.\n ";
  }
private:
  static Singleton * m_sig_instance;
  static std::mutex m_mutex;
};
Singleton * Singleton::m_sig_instance = NULL;
std::mutex Singleton::m_mutex;
int main()
{
  Singleton::GetInstence()->Print();
  return 0;
}

借助static的栈特性和类的作用域,在类的作用域内用static特性实现资源的释放:

#include <iostream>
#include <mutex>
using namespace std;
class Singleton{
private:
  Singleton() = default;
  Singleton(const Singleton & s) = delete;
  Singleton &operator = (const Singleton &s) = delete;
  ~Singleton(){};
  class FreeSingleton
  {
    public:
      ~FreeSingleton()
      {
        cout<<"start free singletion \n";
        if(m_sig_instance != NULL)
        {
          cout<<"free singletion \n";
          delete m_sig_instance;
          m_sig_instance = NULL;
        }
      }
  };
public:
  //对静态成员操作,所以控制成static
  static Singleton * GetInstence()
  {
    if(Singleton::m_sig_instance == NULL)
    {
      m_mutex.lock();
      if(Singleton::m_sig_instance == NULL)
      {
        m_sig_instance = new Singleton();
      }
      m_mutex.unlock();
    }
  }
  void Print()
  {
    cout<<"Singleton Instence.\n ";
  }
private:
  static Singleton * m_sig_instance;
  static std::mutex m_mutex;
  static FreeSingleton m_freed;
};
Singleton * Singleton::m_sig_instance = NULL;
std::mutex Singleton::m_mutex;
//借助static 栈的特性,通过析构释放对应的内存 注意这里的类型和static变量的作用域取值
Singleton::FreeSingleton Singleton::m_freed; 
int main()
{
  Singleton::GetInstence()->Print();
  return 0;
}
目录
相关文章
|
9月前
|
设计模式 缓存 安全
创建型设计模式06-单例模式
创建型设计模式06-单例模式
28 0
|
4天前
|
设计模式 缓存 安全
【Java设计模式 - 创建型模式1】单例模式
【Java设计模式 - 创建型模式1】单例模式
4 0
|
2月前
|
设计模式 安全 Java
Java设计模式之单例模式
在软件工程中,单例模式是一种常用的设计模式,其核心目标是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。Java作为一门广泛使用的编程语言,实现单例模式是面试和实际开发中的常见需求。
72 9
Java设计模式之单例模式
|
2月前
|
设计模式 安全 数据库
创建型设计模式-单例模式/工厂模式/抽象工厂
创建型设计模式-单例模式/工厂模式/抽象工厂
44 0
|
10月前
|
设计模式 Java
单例模式是一种创建型设计模式
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。
|
11月前
|
设计模式 缓存 Java
设计模式-创建型模式:单例模式
设计模式-创建型模式:单例模式
|
设计模式 安全 算法
设计模式 - 创建型模式_7种单例模式实现
单例模式可以说是整个设计中最简单的模式之⼀,在编程开发中经常会遇到这样⼀种场景,那就是需要保证⼀个类只有⼀个实例哪怕多线程同时访问,并需要提供⼀个全局访问此实例的点。 单例模式主要解决的是,⼀个全局使⽤的类频繁的创建和消费,从⽽提升提升整体的代码的性能。
99 0
设计模式 - 创建型模式_7种单例模式实现
|
设计模式 XML 缓存
【设计模式】-创建型模式-第2章第1讲-【单例模式】
【设计模式】-创建型模式-第2章第1讲-【单例模式】
【设计模式】-创建型模式-第2章第1讲-【单例模式】
|
设计模式
GOF23之单例模式(一)
GOF23之单例模式(一)
GOF23之单例模式(一)
|
设计模式 安全 Java
01.创建型:单例设计模式1
单例设计模式
136 1