gpt4 book ai didi

c++ - 通过工厂设计模式向客户隐藏新的优势是什么

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:57 24 4
gpt4 key购买 nike

我最近读了工厂设计模式,因为他提到了正常方法的问题之一是

*需要在客户端类中使用new关键字。

所以通过使用工厂我们已经实现了这一点(客户端不使用新的)。但是对客户端隐藏新的优势是什么?

一个问题是当客户端使用新的关键字时,他会负责删除那段内存。无论如何,如果我们也使用工厂,我们仍然需要这样做,当客户端在最后创建一个对象时,客户端必须删除它(工厂不会删除它们)。

我了解,其他优势包括重用现有代码且无需更改客户端代码。但是我对通过向客户隐藏新的(甚至类)所取得的成就感到困惑。

提前致谢。

最佳答案

我不认为工厂模式的主要目的是“对客户端隐藏new”。主要目的是“隐藏 哪些 new 被使用以及如何使用。”它让您可以自由选择在您的实现中使用哪个类你实际上会创造。

例如,您可以提供一个接口(interface) Renderer在你的工厂:

class Renderer
{
// ...
};

struct RendererFactory
{
Renderer* createRenderer() const;
};

Renderer* RendererFactory::createRenderer() const
{
#ifdef WIN32
if (AskWinApiIfOpenGlEnabled())
return new OpenGlRenderer();
else
return new DirectXRenderer();
#else
return new OpenGlRenderer();
#endif
}

在 C++ 中,提供工厂函数的另一个好处是确保正确的内存管理。如果将上面的代码更改为返回 std::unique_ptr<Renderer> (这是正确的做法),您可以保护客户端免受 Murphying 内存泄漏(他们可以通过在原始指针情况下不调用 delete 返回值来做到这一点)1.

您甚至可能希望您的工厂保留该对象的部分所有权(以便它可以重用它们),因此您可以这样做:

class RendererFactory
{
std::weak_ptr<Renderer> cachedRenderer;

public:
std::shared_ptr<Renderer> createRenderer();
};

std::shared_ptr<Renderer> RendererFactory::createRenderer()
{
if (auto r = cachedRenderer.lock())
return r;
auto r = std::make_shared<RendererSubClass>();
cachedRenderer = r;
return r;
}

总而言之,基于工厂的创 build 计模式(抽象工厂和工厂方法)让您可以更好地控制创建和初始化的方式。


1 当然,他们仍然可以通过执行 createRenderer().release() 来马基雅维利的内存泄漏。 , 但这是他们的积极行动,而不仅仅是疏忽。

关于c++ - 通过工厂设计模式向客户隐藏新的优势是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27598254/

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