设计模式之单例模式

一、单例模式中的角色和职责

Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的 getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个 Singleton类型的静态对象,作为外部共享的唯一实例

如何构建单例
一是单例模式的类只提供私有的构造函数
二是类定义中含有一个该类的静态私有对象
三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象

二、适用场景

1、系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源
管理器,或者需要考虑资源消耗太大而只允许创建一个对象
2、 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不
能通过其他途径访问该实例

三、示例代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//实现单例步骤
//1. 构造函数私有化
//2. 增加静态私有的当前类的指针变量
//3. 提供静态对外接口,可以让用户获得单例对象

//懒汉式 
class Singleton_Lazy{
private:
	Singleton_Lazy(){}
public:
	static Singleton_Lazy* getInstance(){
		if (pSingleton == NULL){
			pSingleton = new Singleton_Lazy;
		}
		return pSingleton;
	}
private:
	static Singleton_Lazy* pSingleton;
};

//类外初始化
Singleton_Lazy* Singleton_Lazy::pSingleton = NULL;

//饿汉式
class Singleton_Hungry{
private:
	Singleton_Hungry(){}
public:
	static Singleton_Hungry* getInstance(){
		return pSingleton;
	}

private:
	static Singleton_Hungry* pSingleton;
}; 
Singleton_hungry* Singleton_Hungry::pSingleton = new Singleton_Hungry;


void test(void)
{
	
	Singleton_Lazy* p1 = Singleton_Lazy::getInstance();
	Singleton_Lazy* p2 = Singleton_Lazy::getInstance();

	if (p1 == p2){
		cout << "是单例!" << endl;
	}
	else{
		cout << "不是单例" << endl;
	}

	Singleton_Hungry* p3 = Singleton_Hungry::getInstance();
	Singleton_Hungry* p4 = Singleton_Hungry::getInstance();

	if (p3 == p4){
		cout << "是单例" << endl;
	}
	else{
		cout << "不是单例" << endl;
	}
}


int main(void){
	test();

	return 0;
}

PS:懒汉模式不是线程安全的,饿汉模式是线程安全的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值