加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 帮我删除一个单身人士:寻找一个替代方案

发布时间:2020-12-16 07:54:04 所属栏目:百科 来源:网络整理
导读:背景:我有一些实现主题/观察者设计模式的类,我已经做了线程安全.主题将通过一个简单的方法通知观察者观察者 – 如果观察者被构造在与发出通知相同的线程中,则通知(this).但是如果观察者被构造在不同的线程中,则通知将被发布到队列中,稍后由构造观察者的线程
背景:我有一些实现主题/观察者设计模式的类,我已经做了线程安全.主题将通过一个简单的方法通知观察者观察者 – >如果观察者被构造在与发出通知相同的线程中,则通知(this).但是如果观察者被构造在不同的线程中,则通知将被发布到队列中,稍后由构造观察者的线程进行处理,然后可以在处理通知事件时进行简单的方法调用.

所以…我有一个地图关联线程和队列,当线程和队列被构造和销毁时,它们被更新.此映射本身使用互斥体来保护对其的多线程访问.

地图是单身人士.

过去因为“只有一个在这个应用程序”,我一直犯过单身人士的罪,相信我 – 付出了我的忏悔!

我的一部分不禁想到在应用程序中确实只有一个队列/线程映射.另一个声音说,单身不好,你应该避免他们.

我喜欢删除单身人士的想法,并能够将其存根进行单元测试.麻烦的是,我很难想到一个很好的替代解决方案.

过去工作的“通常”解决方案是传递一个指向对象的指针,而不是引用单例.我认为在这种情况下这将是棘手的,因为观察者和主题在我的应用程序中是10美分,并且将队列/线程映射对象传递到每个观察者的构造函数中将非常尴尬.

我很欣赏的是,在我的应用程序中,我可能只有一张地图,但是不应该放在主题和观察者类代码的排列位置.

也许这是一个有效的单身人士,但我也会感谢任何关于我如何删除它的想法.

谢谢.

PS.我在接受的答复中提到了What’s Alternative to Singleton和this article.我不禁想到ApplicationFactory只是另一个名字的另一个单身人士.我真的看不到优势.

解决方法

如果试图摆脱单身化的唯一目的是从单元测试的角度来看,也许用可以插入存根的东西替换单体吸气剂.
class QueueThreadMapBase
{
   //virtual functions
};

class QeueueThreadMap : public QueueThreadMapBase
{
   //your real implementation
};

class QeueueThreadMapTestStub : public QueueThreadMapBase
{
   //your test implementation
};

static QueueThreadMapBase* pGlobalInstance = new QeueueThreadMap;

QueueThreadMapBase* getInstance()
{
   return pGlobalInstance;
}

void setInstance(QueueThreadMapBase* pNew)
{
   pGlobalInstance = pNew
}

然后在你的测试中只是换出队列/线程图实现.至少这个单身人士再多一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读