23种设计模式之三(创建型模式)Singleton模式

一、简介

        Singleton 模式是为了解决获得Singleton类的唯一的实例(或变量),Singleton 模式是设计模式中最为简单、最为常见、最容易实现也是最应该熟悉和掌握的模式。在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,但局变量在项目中是能不用就不用的,它是一个定时炸弹,是一个不安全隐患,特别是在多线程程序中,会有很多的不可预测性同时使用全局变量,也不符合面向对象的封装原则。单例模式却能解决这些问题。

        下图是 Singleton 模式的结构图通过维护一个 static 的成员变量_instance来记录这个唯一的对象实例,通过提供一个 staitc 的接口 Instance (程序中改为GetInstance)来获得这个唯一的实例


二、详解

1、代码实现

(完整代码已上传到csdn)

(1)代码singleton.h:

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

#include <iostream>
using namespace std;
class Singleton
{
    public:
        static Singleton *GetInstance();
        static void DestoryInstance();
    protected:
        Singleton();
        ~Singleton();
    private:
        static Singleton *_instance;
};

#endif
(2)代码singleton.cpp:
#include <iostream>
#include "singleton.h"
using namespace std;

Singleton *Singleton::_instance = NULL;

Singleton::Singleton()
{
    cout<<"Singleton constructor"<<endl;
}

Singleton::~Singleton()
{
    cout<<"Singleton destructor"<<endl;
}

void Singleton::DestoryInstance()
{
    cout<<"---DestoryInstance"<<endl;
    if (_instance) {
        delete _instance;
        _instance = NULL;
    }
}

Singleton *Singleton::GetInstance()
{
    cout<<"---GetInstance"<<endl;
    if (_instance == NULL) {
        cout<<"------new Singleton()"<<endl;
        _instance = new Singleton();
    }
    else {
        cout<<"------not new Singleton()"<<endl;
    }
    return _instance;
}
(3)代码main.cpp:
#include <iostream>
#include "singleton.h"
using namespace std;

int main()
{
    Singleton *sign = Singleton::GetInstance();
    Singleton *sign2 = Singleton::GetInstance();
    
    Singleton::DestoryInstance();
    return 0;
}
(4)makefile:
CFLAGS = -g
DEFINED = #-D _VERSION
LIBS = 
CC = g++
INCLUDES = -I./
OBJS= main.o singleton.o
TARGET= main
all:$(TARGET)

$(TARGET):$(OBJS)
	$(CC) $(CFLAGS) -o $@ $(OBJS)

.SUFFIXES:.o .h
.SUFFIXES:.cpp .o
.cpp.o:
	$(CC) $(DEFINED) -c $(CFLAGS) -o $@ $<

ok:
	./$(TARGET)
clean:
	rm -f $(OBJS) $(TARGET) core *.log

2、运行结果

(centos6.3系统中运行结果:)


三、总结

(1)Singleton 不可以被实例化因此需要将构造函数声明为 protected直接声明为 private,同时也不能delete将析构函数声明为 protectedprivate

(2)Singleton 模式在开发中经常用到并且经常和 Factory(AbstractFactory)模式在一起使用,因为系统中工厂对象只要一个用来创建对象就可以了

(3)上述Singleton 模式没有考虑到多线程的问题,在多线程的情况下就可能创建多个Singleton实例,可以通过加互斥锁的方式解决,可参看相关博文。

(4)源码已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/8403325)。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值