设计模式篇二(单例模式)

1、什么是单例模式:

确保一个类仅有一个唯一的实例,并且提供一个全局的访问点。

2、环境及问题:

这里写图片描述
如上图所示,每次使用一个类的时候,首先都需要实例化一个对象。不管是new还是定义局部变量。但多次调用new,就会拿到多次该对象的实例。那有没有这样一种情况:多次调用new时都拿到同一个实例化对象?比如数据库连接,大家都知道建立一个数据库连接消耗的资源是巨大的,那是不是每次需要操作数据库的时候都要先建立一个连接呢?有没有一种方法可以让已建立的数据库连接复用?这就是单例模式要解决的问题。

这里写图片描述

上图无论new多少次,都指向类的一个示例,这就是单例模式。它解决了单例模式的独生子女问题,保证了在同一时刻只有类的唯一对象存在。

3、解决方案(c++):

  • 首先将构造方法私有化,屏蔽通过直接实例化的形式来访问。将函数申明改成private属性
  • 在类中声明一个实例,并设置成静态类型。保证该类只有一份
  • 提供一个可以获取实例的方法,用于返回类的示例,并保证得到的是同一个对象

4、代码实现:

实现一:
class A
{
private:
    A(){}       //构造函数私有化
public:
    static A& GetInstance()  //静态函数,获取类唯一成员的接口
    {
        static A globalInstance;  //静态成员,类唯一成员
        return globalInstance;
    }
    void print()
    {
        std::cout<< "Single Instance Pattern"<< std::endl;
    }
};
调用方式:
int main()
{
    A::GetInstance().print();
    return 1;
}

实现二:泛型方法
template<class T>
class SingleInstancePattern
{
public:
    static T& GetInstance()
    {   
        static T globalInstance;
        return globalInstance;
    }   
};

调用方式:
class A: public SingleInstancePattern<A>
{
public:
    void print()
    {   
        std::cout<< "Single Instance Pattern"<< std::endl;
    }   
};

int main()
{
    /*注意:此单例模式是使用继承模板类实现,其优点是可复用,需要用单例
    的类只需继承SingleInstancePattern模板类即可。但因为模板类中并没
    有将该类的构造函数私有化,所以直接局部变量实例化对象也是可以的,这就
    需要在代码实现层严格控制每个实例化对象都通过调用模板类中GetInstance()
    方法获得才能保证其唯一性。对于单例模式的原则而言,这种实现方式并
    不属于严格的单例实现,但因为模板类的可复用和实现简单也被广泛使用
    */
    A::GetInstance().print();
    return 1;
}

以上代码仅为个人愚见,如有疑问请各位看官指出。tks

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值