浅说单态类 2009-11-30 00:27

一说单态类,好多程序员都感觉脑袋大了,什么是单态类,它是干什么的,类不是可以有许多的实例吗,怎么会有单态类?

        说白了,单态类就是类的实例只有一个.这样大家就都会明白了吧.但是如何做类的实例只有一份呢?大家的困惑的地方只有一个,就是类可以在多处new 这个类的实例. 可以说new 无处不在.那怎么实现类只有一个实例呢.对吧?其实这是惯性思维的结果,如果我们逆向思维一下就会明白如何实现类的一个实例.列入 类A,我们可以在任何地方 new A对吧,我们禁止它new A不就可以实现了吗.但是如何禁止new A呢?我们先看一下new A的操作过程吧. 编译器在编译new A时,因为A是一个类,所以new时首先调用A的构造函数(有点屁话,new  A 本来就是调用A的构造函数吗....呵呵,如何我们重载了new 操作符在new A时,未必调用A的构造函数哦.这个地方讨论的是默认的new,没有经过我们重载过的哦.所以它调用A的构造函数),这样就生成了许多许多的实例.说道这,大家能明白了吗?如果没有明白那你可以去一边吃黄瓜去了.呵呵... 如果类的构造函数是公共的,他们就可以随意在任何地方new ,但是如果是私有的呢,它还能随便new吗?思路有了.声明一个单态类,就是把类的构造函数声明为私有的,但是构造函数的实例如何来?我们又如何捕获这个实例呢?就第一个问题,我提醒一下,私有函数,外部不能调用,但是内部可以调用的,对吧.第2个问题,我提醒一下,类的静态成员和静态函数的生存周期是贯穿于整个进程的整个周期是吧.这时我们提供一个公共方法,它仅返回这个实例就可以了吧,如果实现这个实例返回值只有一个,不就是实现了单态类了吗.

如何实现返回值只有一个呢?加个判断就可以了吗,if 实例 != NULL 就返回实例,== NULL就new 一个实例.嘿嘿...简单吧.

看看简单的实现吧.

class A

{

private:

A()

{

// 成员操作

}

~A()

{

// delete 操作

}

 

public:

static A* getInstance()

{

if (NULL ==  m_instance)

{

 m_instance = new A;

}

}

private:

static A* m_instance; // 单态类的实例

};

 怎么样?简单吧!

posted @ 2019-06-09 10:09  沙漠驼铃  阅读(106)  评论(0编辑  收藏  举报