gpt4 book ai didi

c++ - 是否可以在 C++ 中创建一个符合开放/封闭原则的工厂?

转载 作者:行者123 更新时间:2023-11-30 01:32:56 24 4
gpt4 key购买 nike

在我使用 C++ 进行的项目中,我需要为通过网络传入的消息创建对象。我目前正在使用 factory method pattern隐藏对象的创建:

// very psuedo-codey
Message* MessageFactory::CreateMessage(InputStream& stream)
{
char header = stream.ReadByte();

switch (header) {
case MessageOne::Header:
return new MessageOne(stream);
case MessageTwo::Header:
return new MessageTwo(stream);
// etc.
}
}

我的问题是我很懒,不喜欢在两个地方写类名!

在 C# 中,我会在第一次使用工厂时进行一些反射(reflection)(额外的问题:这是对反射的一种 OK 用法,对吧?)但是由于 C++ 缺乏反射,所以这是不可能的。我考虑过使用某种注册表,以便消息在启动时向工厂注册自己,但这受到了 non-deterministic (or at least implementation-specific) static initialization order problem 的阻碍。 .

所以问题是,是否有可能在遵守开放/封闭原则的情况下在 C++ 中实现这种类型的工厂,以及如何实现?

编辑:显然我想多了。我打算将这个问题设置为“您将如何在 C++ 中执行此操作”,因为在其他语言中使用反射确实很容易做到。

最佳答案

我认为开放/封闭方法和 DRY 是很好的原则。但它们并不神圣。目标应该是使代码可靠和可维护。如果您必须执行不自然的行为来遵守 O/C 或 DRY,那么您可能只会让您的代码不必要地变得更复杂,而没有任何实质性好处。

这里是 something I wrote几年前我是如何做出这些判断的。

关于c++ - 是否可以在 C++ 中创建一个符合开放/封闭原则的工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/855123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com