单例的实现方法有很多种,不同的语言都大同小异,这里直接上代码 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![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
(1)第
![](https://i-blog.csdnimg.cn/blog_migrate/04d53ea1dc1aaff9b8e8dbe645c5527e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7222955cd8fa2ffe2f95e3feea3e7cdb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
当我们同时编译多
![](https://i-blog.csdnimg.cn/blog_migrate/7222955cd8fa2ffe2f95e3feea3e7cdb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d8c602e07410aae6afe4cf4194610197.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
所有未加static前缀
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d8c602e07410aae6afe4cf4194610197.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9c66eeb4a4915d462ae93a4b5f6ad64c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d958c120ddcd6790c09cf319e8db8050.png)
![](https://i-blog.csdnimg.cn/blog_migrate/807ec6960655cb647bf4b708445dc3cd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9d3b6b0a9fd58e06ed10753399730a3b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9c66eeb4a4915d462ae93a4b5f6ad64c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
说到这里就明白为什么要使用static了。 当然不适用它也没有错,但是明显不符合我们设计的预期。
(2)static
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7222955cd8fa2ffe2f95e3feea3e7cdb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f030e8fd4c251b16736fe57d5aab1448.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4ce4d7bd0c436f46ce5ceb60171138f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4ce4d7bd0c436f46ce5ceb60171138f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9d3b6b0a9fd58e06ed10753399730a3b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f030e8fd4c251b16736fe57d5aab1448.png)
![](https://i-blog.csdnimg.cn/blog_migrate/04d53ea1dc1aaff9b8e8dbe645c5527e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/04d53ea1dc1aaff9b8e8dbe645c5527e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4ce4d7bd0c436f46ce5ceb60171138f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a7b86054d04c9af37a37e5036cd655d5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d8c602e07410aae6afe4cf4194610197.png)
![](https://i-blog.csdnimg.cn/blog_migrate/525e63d139a5b2705c3eac65f0aff7ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d8c602e07410aae6afe4cf4194610197.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f030e8fd4c251b16736fe57d5aab1448.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
(3)static
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7222955cd8fa2ffe2f95e3feea3e7cdb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f030e8fd4c251b16736fe57d5aab1448.png)
![](https://i-blog.csdnimg.cn/blog_migrate/34142ee85437c35f46a04f7f63d1412a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/14e6ae835b3688105bb1c5bf984a92d4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/04d53ea1dc1aaff9b8e8dbe645c5527e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/34142ee85437c35f46a04f7f63d1412a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4ce4d7bd0c436f46ce5ceb60171138f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4ce4d7bd0c436f46ce5ceb60171138f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7c397670bcb10f4bc247f8f6c42b9506.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f030e8fd4c251b16736fe57d5aab1448.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/14e6ae835b3688105bb1c5bf984a92d4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/04d53ea1dc1aaff9b8e8dbe645c5527e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d8c602e07410aae6afe4cf4194610197.png)
![](https://i-blog.csdnimg.cn/blog_migrate/525e63d139a5b2705c3eac65f0aff7ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/da619d101b0e42537a1131deffbabd09.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cba65bfae0bd11f20564889cd29d1e3f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/04d53ea1dc1aaff9b8e8dbe645c5527e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/da06367812f66c202762db154b181cc2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d10977d2fdd0aff57d8448318e46229f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/da619d101b0e42537a1131deffbabd09.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f030e8fd4c251b16736fe57d5aab1448.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/34142ee85437c35f46a04f7f63d1412a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4ce4d7bd0c436f46ce5ceb60171138f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7b35de3eb6400d37f9071573d18ca60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/525e63d139a5b2705c3eac65f0aff7ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9c66eeb4a4915d462ae93a4b5f6ad64c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/564a9aeb338db16d313e4cb5f4b2e66f.png)
问题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;
}
这样也可以。
所以单例模式的根本就是 对象只被实例化一次,只要保证了这个,形式上就随意了。