几天没有写东西了,不过发现写些有内涵的东西的却不容易,也许是自己的功力还不够。话不多说,开干。
前面谈了单例的使用条件以及创建单例的基本范例(基于C++),今天就来谈谈单例的继承。单例继承一般用于跨平台,或者其他需要单例类内部封装不同,而对外提供一致性的地方。所以第一步就是抽象出接口,也就是对外提供一致性。第二步就是子类来实现接口功能,也就是做区分。那么第三步就是创建实体,怎么来创建。请看下面的代码示例:
//第一步:创建基类的抽象接口
class MySystem
{
public:
virtual ~MySystem() {}
virtual int* getSomething() = 0;
virtual void setSomething(int* thing) = 0;
};
//第二步:创建实现接口的子类
class AndroidSystem : public MySystem
{
public:
virtual int* getSomething()
{
//基于Android的实现
}
virtual void setSomething(int* thing)
{
//基于Android的实现
}
}
class IOSSystem : public MySyetem
{
public:
virtual int* getSomething()
{
//基于IOS的实现
}
virtual void setSomething(int* thing)
{
//基于IOS的实现
}
}
//第三步:创建单例的唯一实体
class MySyetem
{
public:
static MySyetem* instance()
{
#if PLATFORM == ANDROID
static MySyetem* instance = new AndroidSystem ();
#elif PLATFORM == IOS
static MySyetem* instance = new IOSSystem ();
#endif
return instance;
}
virtual ~MySyetem() {}
virtual int* getSomething() = 0;
virtual void setSomething(int* thing) = 0;
protected:
MySyetem() {}
};
每个子类根据不同的平台封装各自的实现。而基类根据不同的平台或者环境创建不同的实例,并对外提供接口的一致性。这样处理使一些跨平台的处理在逻辑上变的简单,明了。职责划分的很清楚。
这两次可能都在谈单例的优点和用法,下一次打算谈谈单例的缺点。