设计模式在游戏服务器应用


以下结构,均来自我们的服务器框架结构中所展现的奇淫技巧,博大颈深,值得我这只菜鸟,好好研究一番。
单列基本雏形,目的就是只能产生一个对象,以下完整实现
#include<iostream>
using namespace std;
class Singleton    
{    
private:    
Singleton();//注意:构造方法私有    
virtual ~Singleton();    
static Singleton* instance;//惟一实例    
int var;//成员变量(用于测试)    
public:    
static Singleton* GetInstance();//工厂方法(用来获得实例)    
int getVar();//获得var的值    
void setVar(int);//设置var的值    
};   
//构造方法实现    
Singleton::Singleton()    
{    
this->var = 20;    
cout<<"Singleton Constructor"<<endl;    
}    
Singleton::~Singleton()    
{    
delete instance;    
}    
//初始化静态成员    
Singleton* Singleton::instance=NULL;  
Singleton* Singleton::GetInstance()    
{    
if(instance==NULL)
{
instance=new Singleton();
}
return instance;    
}    
//seter && getter含数    
int Singleton::getVar()    
{    
return this->var;    
}    
void Singleton::setVar(int var)    
{    
this->var = var;    
}    
//main    
int main(int argc, char* argv[])    
{    
Singleton *ton1 = Singleton::GetInstance();    
Singleton *ton2 = Singleton::GetInstance();    
cout<<"ton1 var = "<<ton1->getVar()<<endl;    
ton1->setVar(150); 
cout<<"ton2 var = "<<ton2->getVar()<<endl;
//Singleton *ton3();
//cout<<ton3->getVar()<<endl;
//如果有上句话,出出现 error C2227: left of '->getVar' must point to class/struct/union,这样懂了吧。
return 0;    
}

如果大型游戏服务器中,就需要智能指针来进行统一管理,自动析构对象,也就是为什么需要使用智能指针,参考CSDN博客
http://blog.csdn.net/skiing_886/article/details/7937907 
#include<iostream>
using namespace std;
template<typename T>
class CVAutoPtr
{
public:
CVAutoPtr() : m_auto_ptr(0) {}
    CVAutoPtr(T* ptr) : m_auto_ptr(ptr) {}
    CVAutoPtr(const CVAutoPtr& obj) : m_auto_ptr(obj.get()) {}
~CVAutoPtr() { reset (0); }

    CVAutoPtr& operator= (const CVAutoPtr& obj)
    {
        this->m_auto_ptr = obj.get();
        return *this;
    }

T* get() const { return m_auto_ptr; }
    T* operator() () { return get(); }

void reset(T* ptr)
    {
        if (m_auto_ptr == ptr)
        {
            return;
        }

        if (m_auto_ptr)
        {
            delete m_auto_ptr;
        }

        m_auto_ptr = ptr;
    }

private:
T* m_auto_ptr;
};
template<typename T, int X = 0> class CVSingleton 
{
private:
CVSingleton() {}
CVSingleton(const CVSingleton&) {}
~CVSingleton() {}
CVSingleton& operator= (const CVSingleton &) { return *this; } 

public:
static T* Instance()
{
static CVAutoPtr<T> autoptr;
  if(autoptr.get() == 0)
{
  autoptr.reset(new T);
}
  return autoptr.get();
}
};
class CPlayerInfoMaster
{
public:
void Init()
{
cout<<"单列模式+智能指针,这就好比java垃圾回收器一样"<<endl;
}
};
#define  PLAYER_INFO_MASTER (CVSingleton<CPlayerInfoMaster>::Instance())
int main()
{
PLAYER_INFO_MASTER->Init();
return 0;
}
操,中午了,先去吃饭。 

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值