【单例模式】

单例模式的单线程实现:

将构造函数和静态实例设置为private

#include<iostream>
using namespace std;
class singleton
{
protected:
    singleton(){}
private:
    static singleton* p;
public:
    static singleton* instance(){
		if (p == NULL)
			p = new singleton();
		return p;
	}
};

类的静态成员如果要在外部使用的话,需要在外部初始化

class singleton
{
private:
	singleton(){}
    static singleton* p;
public:
    singleton* instance();
};

// static 成员一定要在类外初始化
singleton* singleton::p = NULL;

singleton* singleton::instance()
{
	
	if (p == NULL)
		p = new singleton();
	return p;
}

当两个线程都判断了if(instance==NULL)  但是又都没有新建一个对象的时候,就会生成两个对象。

方法一是加锁:

加锁可以正常运行,但是效率不高

class singleton
{
private:
	singleton(){}
    static singleton* p;
	
public:
    singleton* instance();
};

// static 成员一定要在类外初始化
singleton* singleton::p = NULL;

singleton* singleton::instance()
{
	// lock();
	if (p == NULL)
		p = new singleton();
	// unlock();
	return p;
}

进一步有效效率,只是在多个线程第一次尝试创建实例的时候加锁。

class singleton
{
private:
	singleton(){}
    static singleton* p;
	
public:
    singleton* instance();
};

// static 成员一定要在类外初始化
singleton* singleton::p = NULL;

singleton* singleton::instance()
{
	
	if (p == NULL)
		// 进一步提升效率,只是在多个线程第一次尝试创建实例的时候加锁
		// lock();
		if (p == NULL)
			p = new singleton();
		// unlock();
	return p;
}

在C#里面可以通过静态变量静态构造函数来构造单例模式

利用静态变量实现单例模式

按 Ctrl+C 复制代码

public class SingletonThird
    {
        /// <summary>
        /// 静态变量
        /// </summary>
        private static SingletonThird _SingletonThird = new SingletonThird();
        
        public static SingletonThird CreateInstance()
        {
            return _SingletonThird;
        }
    }
按 Ctrl+C 复制代码
是不是觉得很优雅, 利用静态变量去实现单例,  由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次

 

PS: 但是他的缺点也很明显, 在程序初始化后, 静态对象就被CLR构造了, 哪怕你没用。

 

 

利用静态构造函数实现单例模式

 

复制代码
    public class SingletonSecond
    {
        private static SingletonSecond _SingletonSecond = null;

        static SingletonSecond()
        {
            
            _SingletonSecond = new SingletonSecond();
        }
        
        public static SingletonSecond CreateInstance()
        {
            return _SingletonSecond;
        }
    }
复制代码
静态构造函数:只能有一个,无参数的,程序无法调用 。

同样是由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次

 

同静态变量一样, 它会随着程序运行, 就被实例化, 同静态变量一个道理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值