问题标签 [abstract-factory]
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.
castle-windsor - 温莎城堡型工厂设施等价物
是否有任何其他 .NET IoC 容器提供与 Castle Windsor 中的类型化工厂设施等效的功能?
例如,如果我在 WPF 应用程序中使用抽象工厂模式:
我不想为我希望展示的每种类型的 ViewModel 创建 IAnotherViewModelFactory 的手动实现,我希望容器为我处理这个问题。
design-patterns - 设计模式:抽象工厂与工厂方法
注:问题在文末。
我已经阅读了有关Abstract Factory vs Factory Method的其他 stackoverflow 线程。我了解每种模式的意图。但是,我不清楚定义。
工厂方法定义了一个用于创建对象的接口,但让子类决定要实例化哪些接口。工厂方法允许类将实例化推迟到子类。
相比之下,抽象工厂提供了一个接口,用于创建相关或依赖对象的系列,而无需指定它们的具体类。
——约翰·费米内拉
抽象工厂看起来与工厂方法非常相似。我画了几个 UML 类来说明我的观点。
笔记:
- 该图来自www.yuml.com,因此它们的方向并不完美。但它是一项免费服务:)。
- 图表可能并不完美。我仍在学习GoF设计模式。
工厂方法:
抽象工厂(只有 1 名成员):
抽象工厂(更多成员):
问题:
- 如果抽象工厂只有一个创造者和一个产品,那还是抽象工厂模式吗?(创建家庭的界面)
- 工厂方法具体创建者可以从接口创建还是必须来自类?(类将实例化推迟到子类)
- 如果抽象工厂只能有一个创建者和一个产品,那么抽象工厂和工厂方法的唯一区别是前者的创建者是一个接口,后者的创建者是一个类吗?
dependency-injection - 使用 Ninject、MVC 3 和使用服务定位器模式的依赖注入
自从我阅读了关于另一个 stackoverflow 问题的答案(现在我不知道确切的问题)的答案以来,一直困扰着我的事情是,用户说“如果您正在调用服务定位器,那么您做错了。 ”
这是一个声望很高的人(我想有几十万)所以我倾向于认为这个人可能知道他们在说什么。自从我第一次开始了解 DI 以及它与单元测试的关系以及不相关的情况以来,我一直在我的项目中使用 DI。这是我现在相当舒服的事情,我想我知道我在做什么。
但是,有很多地方我一直在使用服务定位器来解决项目中的依赖关系。一旦主要示例来自我的 ModelBinder 实现。
典型模型粘合剂的示例。
不是真正的实现——只是一个简单的例子
由于第一次请求Binder 时 ModelBinder 实现需要一个新实例,因此不可能在此特定实现的构造函数上使用依赖注入。
我的很多课都是这样。另一个例子是缓存过期进程,只要缓存对象在我的网站中过期,它就会运行一个方法。我运行了一堆数据库调用,什么都没有。我也在使用服务定位器来获取所需的依赖项。
我最近遇到的另一个问题(我在这里发布了一个问题)是我所有的控制器都需要一个 IDataContext 的实例,我使用 DI 来处理它——但是一个操作方法需要一个不同的 IDataContext 实例。幸运的是,Ninject 带来了一个命名依赖项。然而,这感觉像是一个杂牌,而不是一个真正的解决方案。
我认为我至少对关注点分离的概念理解得相当好,但我对依赖注入和服务定位器模式的理解似乎存在根本性的错误——我不知道那是什么。
我目前理解它的方式 - 这也可能是错误的 - 是,至少在 MVC 中,ControllerFactory 为 Controller 查找构造函数并调用 Service Locator 本身以获取所需的依赖项,然后将它们传递进去。但是,我可以理解,不是所有的类和什么都没有工厂来创建它们。所以在我看来,一些服务定位器模式是可以接受的......但是......
- 什么时候不能接受?
- 当我应该重新考虑如何使用服务定位器模式时,我应该注意哪种模式?
- 我的 ModelBinder 实现错了吗?如果是这样,我需要学习什么来解决它?
- 在另一个与该用户类似的问题中,Mark Seemann推荐了一个抽象工厂——这有什么关系?
我想就是这样 - 我真的想不出任何其他问题来帮助我理解,但非常感谢任何额外的信息。
我知道 DI 可能不是所有问题的答案,而且我在实现它的方式上可能有些过火,但是,它似乎以我期望的方式工作,与单元测试一起工作,而不是什么。
我不是在寻找代码来修复我的示例实现——我在寻找学习,寻找解释来修复我有缺陷的理解。
我希望 stackoverflow.com 能够保存草稿问题。我也希望回答这个问题的人在回答这个问题时获得适当的声誉,因为我认为我要求很多。提前致谢。
design-patterns - 策略设计模式和抽象工厂模式有什么区别?
有人可以一劳永逸地向我解释这两者之间的区别,并尝试为何时使用它们提供一种指导吗?例子会非常好。
design-patterns - 抽象工厂和工厂方法可以一起使用吗?
在驳回这个问题之前,我实际上是在提出一个实际问题,而不是引发对话。这是我的场景
我在很多情况下读到抽象工厂是比工厂方法更进一步的实现,我可以在很多情况下看到为什么这是真的。我对这两者之间的区别也有相当好的理解,但我最近遇到了一个场景,我被指示同时使用这两者。
如何做到这一点一直在绞尽脑汁,我仍然不确定是否推荐它作为一种好的做法。
你,或者你能给我举一个例子,在这个例子中应用这两种模式并让它们共存是可行的吗?如果没有,这是一个不好的做法吗?
请不要将我引导到提供这些模式的字典定义的站点,我非常了解每一个,并且每天都在使用,但没有遇到我需要两者的情况。提前谢谢。
design-patterns - 服务定位器模式与抽象工厂模式有什么不同吗?
乍一看,服务定位器模式在我看来与抽象工厂模式相同。它们似乎都有相同的用途(您查询它们以接收抽象服务的实例),并且在我阅读依赖注入时都提到了它们。
然而,我看到服务定位器模式被描述为一个糟糕的想法,但至少在一个主要的依赖注入框架中看到了对抽象工厂模式的直接支持。
如果它们不一样,有什么区别?
design-patterns - 用静态方法实现的工厂
我见过使用静态方法的工厂实现。像这样的东西:
我不确定我是否可以称它为抽象工厂,但这不是问题所在。我对抽象工厂的理解是,它使我们能够灵活地轻松更改产品系列。
如果我想从 更改MyFactory
为YourFactory
则只需要更改一行。我也可以在运行时更改它。但是,如果它们被实现为静态方法,有可能吗?我需要更改对静态工厂的所有调用。如果我们想在运行时决定,还需要在每个地方使用 if-else 检查。
那么使用静态方法实现工厂有什么好处呢?我们不是失去了主要的灵活性吗?我在这里错过了什么?
请注意,没有假定特定的语言。任何帮助表示赞赏。
factory-pattern - 抽象工厂和工厂设计模式有什么区别?
我知道有很多关于这两种模式之间差异的帖子,但有一些我找不到。
从我一直在阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但对客户隐藏实现,因为他们将看到通用产品。我的第一个问题是关于抽象工厂的。它的作用是允许您在其中创建具体对象系列(这可能取决于您使用的特定工厂),而不仅仅是单个具体对象?抽象工厂是否只返回一个非常大的对象或许多对象,具体取决于您调用的方法?
我的最后两个问题是关于一个我无法完全理解的单引号,我在很多地方都看到过:
两者之间的一个区别在于,对于抽象工厂模式,一个类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式使用继承并依赖子类来处理所需的对象实例化。
我的理解是工厂方法模式有一个 Creator 接口,这将使 ConcreteCreator 负责知道要实例化哪个 ConcreteProduct。这就是使用继承来处理对象实例化的意思吗?
现在关于那句话,抽象工厂模式究竟是如何通过组合将对象实例化的责任委托给另一个对象的?这是什么意思?看起来抽象工厂模式在我看来也使用继承来完成构建过程,但我仍然在学习这些模式。
任何帮助,尤其是最后一个问题,将不胜感激。
c# - 在 Unity 中使用抽象工厂作为注入工厂?
我在某些控制器实例中注册了一个抽象工厂以进行注入。我可以注册那个抽象工厂并将其用作注入工厂吗?
这就是我所拥有的:
期望的情况:
总之,我想摆脱StaticLevelFactory。
java - AbstractFactory 有一个转折点
我遇到了一个编程问题:
我的 Eclipse IDE 中有两个Java项目:ProjectA 和 ProjectB。项目 B 引用项目 A
我在 ProjectA 中声明了一个类:ClassA,在 ProjectB 中声明了一个类:ClassB,这样:
我在 ProjectA 中还有一个名为 ClientClass 的类。这个 ClientClass 之前用于创建 ClassA 的实例并使用它。但是现在,根据环境设置,应该为 ClientClass 提供使用 ClassA 或 ClassB 的选项。
这似乎是 AbstractFactory 模式的一个问题,或者我是这么认为的。我需要创建一个提供对 ClassA 或 ClassB 的访问的工厂。ClientClass 不应该知道它是 ClassA 还是 ClassB。这需要我为 ClassA 和 ClassB 创建一个接口。
我遇到的问题:
- ClientClass 不能直接引用 ClassB(没有导入语句/或新调用),因为 ClassB 在不同的项目中。这可能是 Eclipse IDE 的限制,但在将这两个项目作为 jar 文件查看时,这对我来说也很有意义。循环关系是可以避免的。
- 我无法为 ClassA 和 ClassB 创建工厂接口和通用接口,然后通过 AbstractFactory 模式提供 ClassAFactory 或 ClassBFactory。这是因为要在 ClassA 和 ClassB 上调用的方法是静态方法。这些类的方法需要出现在接口上。但是,在 Java 中,不能有“抽象静态”修饰符
谁能为这个问题提出一个优雅的解决方案?