问题标签 [factory-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
288 浏览

php - php < 5.3 中不可能有抽象工厂?

我正在研究一个抽象类,以节省几个类的一些代码。这些类都是通过不同的静态调用实例化自己的工厂。我可以通过将所有这些方法放在一个抽象类中来节省一些代码。

但是,我遇到了后期静态绑定问题……因为我们的网络主机没有使用 5.3 或更高版本,所以我无权访问 get_call_class。如果我有

在抽象类中,__CLASS__是抽象类的名称,当我真正希望它使用被调用的类时。

我在网络上看到过抽象工厂的例子,其中子类有自己的实例化方法,并且不依赖抽象父类。然而,在这种情况下,抽象类的唯一原因是为了节省代码,所以如果我不能在那里做,它的价值就会大大降低。

php < 5.3 中有解决方法吗?debug_backtrace()?


编辑:

我做了一个测试,它似乎debug_backtrace()不起作用!我想这就是我们需要后期静态绑定的原因。

结果:

0 投票
3 回答
16817 浏览

python - Python中的工厂模式

我目前正在用 Python 实现工厂设计模式,我有几个问题。

  1. 有什么方法可以防止直接实例化实际的具体类?例如,如果我有一个生成 Vehicles 的 VehicleFactory,我希望用户只使用该工厂,并防止任何人意外地直接实例化 Car() 或 Truck()。我也许可以在init ()中抛出异常,但这也意味着工厂无法创建它的实例......

  2. 现在在我看来,工厂越来越让人上瘾。似乎一切都应该成为工厂,这样当我更改内部实现时,客户端代码不会改变。我很想知道什么时候需要使用工厂,什么时候不适合使用。例如,我可能有一个 Window 类,而现在只有一个这种类型(没有 PlasticWindow、ReinforcedWindow 或类似的东西)。在这种情况下,我是否应该为客户端使用工厂来生成 Window,以防我将来可能添加更多类型的 Windows?

  3. 我只是想知道是否有一种通常的方式来调用工厂。例如,现在我将我的 Vehicle 工厂称为 Vehicles,因此代码将类似于 Vehicles.create(...)。我看到很多教程都在做类似 VehicleFactory 的教程,但我发现它太长了,而且有点暴露了实现。

编辑:我所说的“公开实施”的意思是它让人们知道它是一个工厂。我的感觉是客户不需要知道它是一个工厂,而是作为一个可以为你返回对象的类(这当然是一个工厂,但也许没有必要明确告诉客户?)。我知道源代码很容易暴露,所以我的意思不是“暴露源代码中实现功能的方式”。

谢谢!

0 投票
3 回答
794 浏览

php - 继承的工厂方法应该返回自己类的实例而不是继承的类

我有一个具有复杂静态工厂方法的类,我们称之为 ClassA。我已经将 ClassA 扩展到 ClassB 并且我希望 ClassB 的工厂方法能够完成 ClassA 的工厂方法所做的所有事情,除了返回一个 ClassB。

这应该呼应ClassB

有没有办法可以使用 ClassA 的工厂方法而不将其复制粘贴到 ClassB?我使用的是 PHP5,但不是 5.3.0。

0 投票
4 回答
6947 浏览

c# - 类型铸造和工厂模式

我很难弄清楚如何在我试图创建的 DTO 映射器中实现工厂模式。我很确定我需要重新考虑我的设计。这是我正在运行的一个非常小的示例:

并使用工厂:

如何在不将其类型转换为 Pilot 的情况下加载飞行员编号?这是错误的方法吗?我可以将试点号码放在 Person 类中,但是 Employee 会继承这个号码,这不是我想要的。我能做些什么?

谢谢!

-杰克逊

0 投票
2 回答
377 浏览

design-patterns - 对象工厂实现

我想在 C# 中创建一个对象工厂。我希望我的对象只能通过这个对象工厂创建,如何实现呢?我知道如何创建一个简单的对象工厂,例如具有创建和初始化对象的公共方法的 satic 类。但我需要确保人们只能通过对象工厂创建对象实例,有什么想法吗?

PS我不喜欢涉及任何反射,只需使用普通的OOP方法。

0 投票
1 回答
98 浏览

language-agnostic - 对Factory做什么的一些疑问

我不太确定完全理解工厂模式。

假设我有一个Customer基本上具有以下方法的类:

  • CreateCustomer- 静态,从头开始创建客户并将其添加到数据库中,
  • LoadCustomerCustomer- 静态,从数据库加载一个实例,
  • KillCustomer-不是静态的,从数据库中删除客户。

如果我理解得很好,

  1. LoadCustomer是进入工厂班的好人选。
  2. 怎么样CreateCustomer?我想它可能会被放入工厂类。是对的吗?如果没有,静态CreateCustomer方法会改变数据库状态,然后调用 CustomerFactory.LoadCustomer. 恕我直言,这是一个糟糕的设计:给定的对象不必了解她自己的工厂的任何信息。
  3. KillCustomer在我看来,工厂是一个非常糟糕的候选者:它作用于一个已经创建的对象,而不是创建一个对象。另一方面:
    • 如果非静态方法将客户从数据库中删除,则对象(从中KillCustomer调用)仍然存在。看到一个对象在数据库级别自杀并仍然保留在业务级别,这是很奇怪的。在这个级别上,从工厂调用KillCustomer会更合理。例如,如果对象被缓存在应用程序中,工厂可以将其从数据库和缓存中删除。
    • 将创建对象的方法和删除对象的方法放在不同的类中似乎也很奇怪。为什么工厂可以只建造一些东西,而永远不会破坏建造的东西?

最后但同样重要的是,假设客户缓存在应用程序中。谁负责管理缓存?IMO,工厂必须这样做:它创建对象,因此选择是否必须加载具有从数据库填充的属性的新对象,或者该对象是否已存在于缓存中是一个很好的选择。

那么,在我对工厂模式的思考中,什么是对的,什么是错的?

0 投票
4 回答
2860 浏览

c# - 使用内部构造函数创建泛型类

是否可以在泛型方法中使用其内部构造函数构造对象?

FooFactory与 位于同一程序集中Foo。类调用工厂方法是这样的:

他们得到编译时错误:

'Foo' 必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法 'FooFactory.CreateFoo()' 中的参数 'TFooType'

有没有办法解决这个问题?

我也试过:

这会在运行时引发相同的错误。

0 投票
1 回答
1167 浏览

web-services - 用于测试和实时 Web 服务的工厂模式

鉴于代码是自动生成的并且我不想更改它(例如添加基类),是否可以在工厂模式中使用 Web 服务?

这样做的一个原因是,如果您有 2 个相同的 Web 服务,但一个用于测试数据,一个用于实时数据,并且您想根据代码运行的环境在服务之间切换。

[编辑]
我正在使用 C# 3。

0 投票
6 回答
369 浏览

c# - 关于工厂设计架构的问题

考虑这个例子

界面

继承者

工厂类

示例用法:

我的问题是,我如何在 ALgorithm1 类上添加另一个方法, 但不在界面中,因为我只在特殊情况下使用它?

我应该如何在 UI 上这样称呼它

还有其他解决方案吗?提前致谢

编辑:我重写它以类似于我当前的项目设计

0 投票
3 回答
3846 浏览

c++ - C++ 中灵活的应用程序配置

我正在开发一个用于模拟真实世界场景的 C++ 应用程序。基于这个模拟,我们的团队将开发、测试和评估在这样一个真实世界场景中工作的不同算法。

我们需要定义几个场景的可能性(它们可能在一些参数上有所不同,但未来的场景可能还需要创建新类的对象)和维护一组算法的可能性(同样是一组参数,但还有要创建哪些类的定义)。参数被传递给构造函数中的类。

我想知道哪个是管理所有场景和算法配置的最佳方式。应该很容易让一个开发人员使用“他的”算法处理一个场景,而另一个开发人员使用“他的”不同算法处理另一个场景。尽管如此,参数集可能很大并且应该是“可共享的”(如果我在场景 A 中为某个算法定义了一组参数,则应该可以在场景 B 中使用该算法而无需复制和粘贴)。

似乎有两种主要方法可以完成我的任务:

  • 定义可以处理我的要求的配置文件格式。这种格式可能是基于 XML 的或自定义的。由于 C++ 中没有类似 C# 的反射,因此每次将新算法类添加到项目时,我似乎都必须更新配置文件解析器(以便将“MyClass”之类的字符串转换为 MyClass 的新实例)。我可以为每个设置创建一个名称并将此名称作为命令行参数传递。

    • 优点是:更改参数并重新运行无需编译,我可以轻松地将整个配置文件与模拟结果一起存储
    • 对比:似乎需要付出很多努力,尤其是困难,因为我使用了很多必须使用给定模板参数实例化的模板类。没有 IDE 支持写入文件(至少没有创建整个 XSD,每次添加参数/类时我都必须更新它)
  • 用 C++ 代码连接所有内容。我不完全确定如何做到这一点来分离所有不同的创建逻辑,但仍然能够跨场景重用参数。我想我也会尝试给每个设置一个(字符串)名称,并使用这个名称通过命令行 arg 选择设置。

    • pro:类型安全,IDE 支持,不需要解析器
    • 缺点:如何轻松存储设置和结果(可能是一些序列化?)?,每次参数更改后都需要编译

现在这里是我的问题: - 你的意见是什么?我错过了重要的优点/缺点吗?- 我错过了第三个选项吗?- 有没有一种简单的方法来实现给我足够的灵活性的配置文件方法?- 你将如何组织所有工厂代码在第二个方法中?有没有像这样的好 C++ 示例?

非常感谢!