gpt4 book ai didi

c# - 在哪里创建抽象工厂

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:42:43 25 4
gpt4 key购买 nike

在抽象工厂中,您声明一个负责创建对象的类型。

这将防止像这样要求开关:

 if( type == ONE ) {
doOne();
} else if( type == TWO ) {
doTwo();
} etc.

或相同:

 switch( type ) {
case ONE: doOne(); break;
case TWO: doTwo(); break;
etc....
}

进入这个:

   MyAbstractFactory factoryInstance = ... ? 

SomeObject object = factoryInstance.createObject();

object.doX();

据我所知,AbstractFactory 将创建正确的对象,而该对象又将以多态方式执行正确的行为。

然后,如果您在程序中使用该对象 10-20 次或 100 次,则不必每次都重复切换。您只需执行相应的方法,然后让多态性完成这项工作。

   object.doY();

object.doZ();

添加新类型就像创建新的混凝土工厂一样简单。

这一切我都清楚。但是……

具体工厂首先在哪里或如何创建(一般而言)?

我一直使用一个单点(通常在 main() 方法或 Configuration.init() 方法中),它又具有 if/else|switch 结构,这是不可避免的,但至少它只被使用一次。

然而,我是“本能地”(或根据常识)这样做的,但从未阅读过任何描述应该在何处创建模式的文档。

:)

最佳答案

由于抽象工厂的主要优点是将工厂正在创建哪些具体项目的知识与工厂的客户分开,因此您希望将这些知识(显然包括具体的工厂实现)远离从代码的其余部分。一种方法是创建一个“FactoryService”,在运行时提供对抽象工厂实例的访问。

您的客户端代码可能如下所示:

FactoryService service = FactoryService.instance();
MyAbstractFactory factory = service.getFactory();
SomeObject obj = factory.createObject();

通过这种方式,您可以在服务中隐藏实例化工厂的逻辑,例如,服务可以从配置文件中读取类名。

许多框架都有组件生命周期管理,允许创建组件并设置它们的依赖关系(如前所述,Spring 就是其中之一)。如果你想基于 Spring,你可以配置 Spring 以将工厂的特定实例注入(inject)到你的工厂服务中。

此方法的另一个优点是可测试性:您可以配置测试运行器以创建模拟工厂并将其注入(inject)到您的服务中。该服务的每个用户都将收到这个用于测试目的的模拟工厂,而无需对其代码进行任何更改。

关于c# - 在哪里创建抽象工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1166192/

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