gpt4 book ai didi

c++ - 工厂模式与全局状态不是一回事吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:27 25 4
gpt4 key购买 nike

假设我有这样一个类:

class MonkeyFish{   MonkeyFish( GlobalObjectA & a, GlobalObjectB & b, GlobalObjectC & c);   private:     GlobalObjectA & m_a;     GlobalObjectB & m_b;     GlobalObjectC & m_c;}

没有工厂,我需要执行以下操作才能实例化 MonkeyFish

GlobalObjectA a;GlobalObjectB b;GlobalObjectC c;int main(){  MonkeyFish * monkey_fish = new MonkeyFish(a, b, c);  monkey_fish->go();}

另一方面,如果我有一个 MonkeyFishFactory,我似乎必须这样做:

GlobalObjectA a;GlobalObjectB b;GlobalObjectC c;int main(){  MonkeyFishFactory mf_factory(a, b, c);  MonkeyFish * monkey_fish = mf_factory.buildMonkeyFish("Bob");  monkey_fish->go();}
  1. 我还有全局对象。

  2. 即使 MonkeyFishFactory 本身在内部创建了 GlobalObjects(因此它们现在位于 MonkeyFishFactory 内部,而不是真正的全局对象),看起来 MonkeyFishFactory 自身 仍然需要是一个全局对象,以便我可以随时访问它来创建 MonkeyFish

在这种情况下,工厂模式与全局状态不是一回事吗?

(我目前假设全局状态是坏事,消除它是好事。)

最佳答案

您是否混淆了这里的概念?

当您返回隐藏在抽象接口(interface)后面的具体类的实例时,通常会应用工厂模式。这个想法是调用者将只看到接口(interface),甚至不必知道对象的具体类型是什么。这一切都是关于根据参数创建对象实例,并将与决定创建什么对象相关的逻辑与创建对象的用户分离。

您所描述的是 Singleton(或 MonoState)和 Factory 的混合体。你的工厂有状态,所以它不能静态化。在这种情况下,您将需要应用类似单例模​​式的东西来控制单个工厂实例的创建,其中隐藏了适当的全局变量:

class IMonkeyFish {
public:
virtual ~IMonkeyFish() = 0;
virtual void go() = 0;
};

class Factory {
public:
static Factory& instance();
IMonkeyFish* createMonkeyFish();
protected:
Factory(GlobalObjectA& a, GlobalObjectB& b, GlobalObjectC& c);
private:
static Factory *theInstance;
GlobalObjectA& instanceOfA;
GlobalObjectB& instanceOfB;
GlobalObjectC& instanceOfC;
};

Factory& factory = Factory::instance();
IMonkeyFish* fishie = factory.createMonkeyFish();
fishie->go();

Singleton 模式控制工厂实例的创建。 Factory 模式隐藏了围绕创建实现 IMonkeyFish 接口(interface)的对象的细节。 Good Thing (TM) 是隐藏全局状态并将 MonkeyFish 具体细节与创建实例解耦。

Singleton 的用法或正确性是另外一个问题。可能还有一堆关于它的线程。

关于c++ - 工厂模式与全局状态不是一回事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/616573/

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