2 回答
TA贡献1942条经验 获得超3个赞
singleton翻译成单例,整个程序运行过程中只能存在这个类的一个对象。
实现方式有三种。
第一种 - 全局静态变量:
1 2 3 4 5 6 7 8 9 10 11 | class Singleton { private: static Singleton instance; //静态变量,全局只有这一个对象 Singleton() {} //构造函数放在private里,让外部无法构造对象 Singleton(const Singleton&); //复制构造函数放在private里,让外部无法复制对象 Singleton& operator=(const Singleton&); //赋值函数放在private里,让外部无法复制对象 public: Singleton& getInstance() { return instance; } };
Singleton Singleton::instance;//构造一个静态变量,作为全局唯一的对象。 |
第二种 - 局部静态变量:
1 2 3 4 5 6 7 8 9 10 11 | class Singleton { private: Singleton() {} //构造函数放在private里,让外部无法构造对象 Singleton(const Singleton&); //复制构造函数放在private里,让外部无法复制对象 Singleton& operator=(const Singleton&); //赋值函数放在private里,让外部无法复制对象 public: Singleton& getInstance() { static Singleton instance; //局部静态变量,全局只有这一个对象 return instance; } }; |
第三种 - 第一次用的时候申请内存,以后都直接用它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Singleton { private: Singleton *instance; Singleton() {} //构造函数放在private里,让外部无法构造对象 Singleton(const Singleton&); //复制构造函数放在private里,让外部无法复制对象 Singleton& operator=(const Singleton&); //赋值函数放在private里,让外部无法复制对象 public: Singleton1* getInstance() { if (instance == NULL) { mutex_lock(); //并没有这个函数,我只是示意一下,表示互斥锁 if (instance == NULL) { instance = new Singleton(); } mutex_release(); //释放互斥锁 } return instance; } }; |
第一种特点是程序加载时间长。因为静态变量是在main函数之前进行构造的。变量存在静态存储区。
第二种特点是第一次用的时候构造,以后都返回它。变量存在静态存储区。
第三种特点是第一次用的时候构造,以后都返回它。变量存在堆内存中。
如果变量占用内存比较大,或者程序里运用特别多的单例导致占用很多内存,不建议用静态存储方式,因为静态存储区的大小是有限的。可能程序都运行不起来。
第三种写起来稍微麻烦,还需要了解互斥锁(多线程编程里会有讲的),不过占用内存较大也能运行!
TA贡献1816条经验 获得超4个赞
单例模式,在spring1..x中,当bean对象的singleton属性为true时,意味着在spring的bean管理池中,只保持一个该bean对象的实例;当bean对象的singleton属性为false时,意味着在spring的bean管理池中,为每一个针对该bean对象的请求都保持一个实例。
- 2 回答
- 0 关注
- 669 浏览
添加回答
举报