单例模式的小疑问分析

单例的实现方法有很多种,不同的语言都大同小异,这里直接上代码 C语言版本。

后面分析一下最简单的单例模式。

#include <stdlib.h>
/*
单例:C语言版	
*/
//声明一个静态全局变量(money只被创建一次,且money的值唯一)
//且不会被释放,持有这个地址。
static int *money = NULL;
//封装一个函数
int *static_fun(void)
{
	if(money == NULL)
	{
		//如果p为空就分配内存(新的)
		money = (int *) malloc(sizeof(int));
		if(money == NULL)
		{
			return NULL;
		}
	}
	//不为空就返回这个变量的地址。
	return money;
}

问题1:为什么要使用static来修饰单例对象?

static作用有三条
(1)第作用:隐藏
当我们同时编译多文件时所有未加static前缀全局变量和函数都具有全局见性
所有未加static前缀全局变量和函数都具有全局见性源文件也能访问在C++中我们可以使用extern来使用其他文件中的全局变量。
加了static会对其源文件隐藏
说到这里就明白为什么要使用static了。 当然不适用它也没有错,但是明显不符合我们设计的预期。
(2)static第二作用保持变量内容持久存储静态数据区变量会程序刚开始运行时完成初始化次初始化共有两种变量存储静态存储区:全局变量和static变量过和全局变量比起来static控制变量见范围底static还用来隐藏
(3)static第三作用默认初始化0其实全局变量也具备属性全局变量也存储静态数据区静态数据区内存所有字节默认值都0x00某些时候特点减少程序员工作量
对static三条作用做总结首先static主要功能隐藏其次因static变量存放静态存储区具备持久性和默认值0


问题2:C++里面有一种说法,构造函数要使用私有的。

其实实现单例的方法有很多种。最懒惰的方法就是:

static int *money = (int *) malloc(sizeof(int));
单例在程序开始运行的时候就有,只要我们不在对money进行释放和重新分配内存就好。

C++里面把构造函数设为私有,这个是例子:http://zhidao.baidu.com/link?url=K7P1BygrMok7_x27feZYF6sCmxufRNCwwYjdYM0qUq1qFxKdtls83DWQ7iepaKlZdSohTm0FJieEEiE_rsYx0K

这只是一种实现方法,我们不必纠结为什么有的根本没有对构造函数设为私有。


我们也可以对要单例的对象在外面再做一层类的封装,如下:

#include "Director.h"
#include "shareDirector.h"
static shareDirector.h * s_ShareDirector.h = nullptr;

Director* Director::getInstance(){
    if (s_ShareDirector==nullptr) {
        s_ShareDirector = new shareDirector();
    }
    return s_ShareDirector;
}

这样也可以。

所以单例模式的根本就是 对象只被实例化一次,只要保证了这个,形式上就随意了。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值