单例模式(某公司校园招聘笔试题目)

单例(singleton)模式, 顾名思义,也就是说类只有一个实例。在计划生育很普遍的今天,我们很容易理解单例模式:首先判断这个家庭是否生了一个孩子,如果没有生,则允许这个家庭生一个,如果已经生了一个,就不能再生孩子了。

      如果外界需要知道这个家庭的信息,那么只需要问该家庭的一个孩子就可以了。如果外界需要10询问这个家庭的信息,没有必要问这个家庭的10个孩子。相反,只需要10次问同一个孩子就可以了,可见,有时候,一个孩子已经足够给外界提供信息。很多人说,孩子生得太多了,花销大。这就是单例!

      在软件开发中,大多数软件都会有一个本地配置文件。比如一个旅游景点介绍软件,其中就有用户登录的部分,那么用户的本地信息就应当由一个对象(单例)来管理,如果需要对用户本地信息进行读写,就可以用单例来实现。下面是单例模式的代码实现:代码1是C#实现,代码2和3是C++实现 (当然也可以用其他语言实现,比如Objective C等)

代码1:
 

using System;
 
class Singleton
{
    private Singleton()  //将构造函数设置为private,不让外界逼迫Singleton类“生孩子”
    {
    }
 
    private static Singleton instance;
    public static Singleton getInstance()
    {
        if (null == instance)  //if语句确保“只生一个孩子”
            instance = new Singleton();
        return instance;
 
    }
 
    public string getLoginIdFromDisk()  //从本地配置文件中获取用户的登陆号码
    {
        return "13400001111";
    }
}
 
//为了方便说明和简化程序,类A和B中的loginId设置为public类型
class A
{
    public string loginId;
}
 
class B
{
    public string loginId;
}
 
class Example
{
    static void Main()
    {
        A a = new A();
        B b = new B();
 
        //由于上面采用了if (null == instance)方式,故s1和s2其实是同一个对象
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
 
        a.loginId = s1.getLoginIdFromDisk();
        b.loginId = s2.getLoginIdFromDisk();
        Console.WriteLine("a.loginId is " + a.loginId);
        Console.WriteLine("b.loginId is " + b.loginId);
 
        if (s1 == s2)
            Console.WriteLine("s1 is the same as s2.");
        else
            Console.WriteLine("s1 is different from s2.");
        
    }
}

代码2:

#include <iostream>
using namespace std;
 
class Singleton
{
private:
	static 	Singleton *pInstance;
    
	Singleton() //将构造函数设置为private,阻止外部“生孩子”
	{
	}
 
public:
	static Singleton *getInstance() //此处的static是让该方法为类方法
	{
		if(NULL == pInstance)//保证“只生一个孩子”
			pInstance = new Singleton;
		return pInstance;
	}
 
	int getLoginIdFromDisk()
	{
		return 110;
	}
};
 
class A
{
public:
	int loginId;
};
 
class B
{
public:
	int loginId;
};
 
Singleton* Singleton:: pInstance = NULL; //必要
 
int main()
{
	A a;
	B b;
	Singleton *p1 = Singleton::getInstance();
	Singleton *p2 = Singleton::getInstance();
 
	a.loginId = p1->getLoginIdFromDisk();
	b.loginId = p2->getLoginIdFromDisk();
 
	cout << a.loginId << endl;
	cout << b.loginId << endl;
 
	if(p1 == p2)
		cout << "p1 is the same as p2" << endl;
	else
		cout << "p1 is different from p2" << endl;
	return 0;
}

代码3:

#include <iostream>
using namespace std;
 
class Singleton;
static Singleton *pInstance = NULL; //静态全局变量
 
class Singleton
{
private:
	Singleton() //将构造函数设置为private,阻止外部“生孩子”
	{
	}
 
public:
	static Singleton *getInstance()  //此处的static是让该方法为类方法
	{
		if(NULL == pInstance) //保证“只生一个孩子”
			pInstance = new Singleton;
		return pInstance;
	}
 
	int getLoginIdFromDisk()
	{
		return 110;
	}
};
 
class A
{
public:
	int loginId;
};
 
class B
{
public:
	int loginId;
};
 
int main()
{
	A a;
	B b;
	Singleton *p1 = Singleton::getInstance();
	Singleton *p2 = Singleton::getInstance();
 
	a.loginId = p1->getLoginIdFromDisk();
	b.loginId = p2->getLoginIdFromDisk();
 
	cout << a.loginId << endl;
	cout << b.loginId << endl;
 
	if(p1 == p2)
		cout << "p1 is the same as p2" << endl;
	else
		cout << "p1 is different from p2" << endl;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值