为了账号安全,请及时绑定邮箱和手机立即绑定

c++ 什么是singleton

c++ 什么是singleton

c++ 什么是singleton
查看完整描述

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函数之前进行构造的。变量存在静态存储区。

第二种特点是第一次用的时候构造,以后都返回它。变量存在静态存储区。

第三种特点是第一次用的时候构造,以后都返回它。变量存在堆内存中。

如果变量占用内存比较大,或者程序里运用特别多的单例导致占用很多内存,不建议用静态存储方式,因为静态存储区的大小是有限的。可能程序都运行不起来。

第三种写起来稍微麻烦,还需要了解互斥锁(多线程编程里会有讲的),不过占用内存较大也能运行!

 


查看完整回答
反对 回复 2019-03-02
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

单例模式,在spring1..x中,当bean对象的singleton属性为true时,意味着在spring的bean管理池中,只保持一个该bean对象的实例;当bean对象的singleton属性为false时,意味着在spring的bean管理池中,为每一个针对该bean对象的请求都保持一个实例。

查看完整回答
反对 回复 2019-03-02
  • 2 回答
  • 0 关注
  • 613 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信