gpt4 book ai didi

c++ - 使用原型(prototype)模式动态配置应用程序

转载 作者:太空狗 更新时间:2023-10-29 23:02:31 26 4
gpt4 key购买 nike

我正在阅读 GoF 书中关于原型(prototype)模式的内容。这是文本片段

Configuring an application with classes dynamically: Some runtime environments let you load classes into an application dynamically. The prototype pattern is the key to exploiting such facilities in a language like C++.

An application that wants to create instances of a dynamically loaded classes won't be able to reference its constructor statically. Instead, runtime environment creates an instance of each class automatically when it's loaded, and registers with a prototype manager. Then the application can ask the prototype manager for newly loaded classes, classes that weren't ;omled with the program orginally

我的问题

  1. 作者所说的“想要创建动态加载类实例的应用程序将无法静态引用其构造函数”是什么意思?例如,如果我们使用动态链接库,我仍然可以使用 new 创建对象,那么作者所说的我们将无法静态引用构造函数是什么意思?

  2. 请求举例说明如何使用原型(prototype)模式来动态利用加载类应用程序。

最佳答案

我的 50 美分:

  1. 我相信作者指的是您在符号库中没有类定义的情况,但是您想要实例化对象,并将它们传递给库使用者函数(所以您是内存所有者,共享库是消费者,但您无权访问库中的具体类)
  2. 例子(我会从头开始写一个来强调一个它会很有用的场景,然后我会写另一个我实际遇到的例子)

    有了动态库 TextEditorWidgets.dll 和您的主应用程序,TextEditorWidget 公开了一个抽象原型(prototype) TEWPrototype 和一个根据比方说字符串标识符获取某些原型(prototype)的工厂方法。

    从 dll 中公开工厂方法定义为:

    TEWPrototype* TEWPrototype::getPrototypeFor(string identifier)
    {
    TEWPrototype* result;
    if (identifier == "SomeWidget")
    {
    result = ConcreteSomeWidgetPrototype;
    } else if ...
    return result;
    }

    在您的应用程序中,您可以使用以下代码:

    {
    vector<TEWPrototype*> allocatedWidgets;
    ...
    TEWPrototype* SomeWidget = TEWPrototype::getPrototypeFor("SomeWidget").clone();// you are now the memory owner
    allocatedWidgets.push_back(SomeWidget); // keep for deletion
    TextEditorWidgetsHandle->doSomethingWithTheWidget(SomeWidget);// pass the instantiation to the consumer who knows the widget full definition
    }

    在上面的示例中,作为应用开发者,您有以下优点:

    • 您将控制 dll 分配的内容、时间和方式
    • 您将控制在应用程序的整个生命周期内是否删除小部件

    dll 开发者的优点:

    • 您将能够在提供向后功能的同时添加新的小部件
    • 您可以保证没有人会在 .dll 之外使用您的内部小部件功能

实际例子:

在开发游戏时,游戏开发团队创建了新实体,我们需要一种快速的方法来为设计师提供新对象,供他们添加到游戏场景中。我们有自己的内部编辑器,所以我们可以控制设计工具。

方法是让世界编辑器加载 .dll,然后在编辑器菜单中显示加载到 dll 中的对象。编辑器不知道 dll 中有哪些类,它只知道它们具有绘制和 setPosition 函数(以及其他一些东西)。

当加载 dll 时,在编辑器中,对象的名称被添加到对象原型(prototype)管理器中(基本上我们有一个静态函数 getAvailableObjects 并且在加载 dll 之后,我们将查询它以获取字符串)。

当设计师从菜单中选择一个对象(比如说 Crate)时,就会创建该对象的一个​​新实例,该实例会在编辑器中绘制,并且设计师可以四处移动它。

编辑器无法自行实例化对象,因为他对对象的大小及其构造函数一无所知。然而,我们为每种类型预先实例化了对象,每次艺术家选择创建"new"Crate 时,这些对象都会被克隆。

预览中也使用了预先实例化的对象。

当开发团队发布了一组新的实体时,我们只是将新的 dll 提供给设计师,他们只需要“刷新”编辑器和 BOOM:奇迹发生了:菜单中的新对象。

作为替代方案,抽象工厂可以提供类似的功能。

关于c++ - 使用原型(prototype)模式动态配置应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28214281/

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