Singleton VS Monostate

singleton,单例模式,这是非常常用的一种模式,相信大多数人都知道。跟singleton类似的还有一种模式叫做monostate,这个可能会感觉生疏一点。

Singleton

在整个系统里面,只有一个实例。通常的做法就是把构造函数声明成私有的,然后专门提供一个静态函数来创建或者返回唯一的实例。比如:

class PicMgr
{
public:
      static PicMgr* getInst()
      {
               static PicMgr mgr;
               return &mgr;
      }
private:
      PicMgr(){}
}
因为构造函数是私有的,所以调用者无法直接创建PicMgr对象,只能通过静态函数,如:

PicMgr* mgr = PicMgr::getInst();
通常getInst函数有两种办法

1. 使用局部静态变量

2. 使用指针在堆上面分配。

反正都差不多。值得注意的是:第一次getInst调用要保证在单线程环境里面。比如在main()或者dllmain()里面调用一把getInst来创建一个实例。不然极端情况下,如果getInst并发了,可能会导致static PicMgr mgr被执行多次,从而导致异常。


Monostate

Monostate是跟singleton有点类似。它主要是使用了静态数据成员。如:

class PicMgr
{
public:
      PicMgr(){}
private:
      static string m_folder;
}
Monostate里面的类是一个普通类,客户可以创建多个对象,但是这些对象都共享一个静态变量。

如果跟singleton相比较的话,

1. singleton控制的是结构,它控制整个系统里面只有一个实例。

2. monostate并不控制结构,客户可以创建多个对象。但是所有对象共享同一个静态变量。也就是说多个对象的行为是一样的。它强调的是行为。


以下内容出自《Agile software development》

MONOSTATE模式的好处

透明性:使用Monostate对象和使用常规对象没有什么区别。使用者不需要知道对象是MONOSTATE.

可派生性:Monostate的派生类都是MONOSTATE.Monostate的所有派生类都是同一个MONOSTATE的一部分。它们共享相同的静态变量。

多态性:由于Monostate的方法不是静态的。所以可以在派生类中覆写它们。因此,不同的派生类可以基于相同的静态变量表现出不同的行为。

MONOSTATE模式的代价

不可转换性:不能透过派生把常规类转换成MONOSTATE类。

效率问题:因为MONOSTATE是真正的对象,所以会导致许多的创建和摧毁开销。

内存占用:即使从未使用MONOSTATE,它的变量也要占据内存空间。


如果希望透过派生去约束一个现存类,并且不介意它的所有调用者都必须调用Instance()方法来获取访问权,那么SINGLETON是最合适的。如果希望类的单一性本质对使用者透明,或者希望使用单一对象的多派生对象,那么MONOSTATE是最合适的。





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值