标签: factory-method

Builder Design模式和Factory Design模式有什么区别?

Builder设计模式和Factory设计模式有什么区别?

哪一个更有利,为什么?

如果我想测试和比较/对比这些模式,我如何将我的发现表示为图表?

design-patterns factory-method factory-pattern builder-pattern

609
推荐指数
13
解决办法
23万
查看次数

476
推荐指数
13
解决办法
22万
查看次数

抽象工厂模式与工厂方法的区别

我知道有很多关于这两种模式之间差异的帖子,但有一些我找不到的东西.

从我一直在阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但是从客户端隐藏实现,因为他们将看到通用产品.我的第一个问题是抽象工厂.它的作用是允许您创建具体对象的族(可能取决于您使用的特定工厂)而不仅仅是单个具体对象?抽象工厂是否只返回一个非常大的对象或许多对象,具体取决于您调用的方法?

我的最后两个问题是关于我在很多地方看到过的单一引言,我无法完全理解:

两者之间的一个区别是,使用抽象工厂模式,类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式使用继承并依赖子类来处理所需的对象实例化.

我的理解是工厂方法模式有一个Creator接口,它将使ConcreteCreator负责知道要实例化的ConcreteProduct.这是通过使用继承来处理对象实例化的意思吗?

现在关于那个引用,抽象工厂模式究竟是如何通过合成将对象实例化的责任委托给另一个对象?这是什么意思?看起来抽象工厂模式也使用继承来完成构建过程,但是我仍然在学习这些模式.

任何帮助,尤其是最后一个问题,将不胜感激.

design-patterns factory-method factory-pattern abstract-factory

420
推荐指数
8
解决办法
19万
查看次数

如何正确实现C++中的工厂方法模式

C++中的这一件事让我感到不舒服很长一段时间,因为我老实说不知道该怎么做,尽管听起来很简单:

如何正确地在C++中实现Factory方法?

目标:允许客户端使用工厂方法而不是对象的构造函数来实例化某个对象,而不会产生不可接受的后果和性能损失.

"工厂方法模式"是指对象内部的静态工厂方法或另一个类中定义的方法,或全局函数.通常只是"将类X的实例化的正常方式重定向到构造函数之外的任何其他位置的概念".

让我略过一些我想到过的可能答案.


0)不要制造工厂,制造建造者.

这听起来不错(实际上通常是最好的解决方案),但不是一般的补救措施.首先,有些情况下,对象构造是一个复杂的任务,足以证明它被提取到另一个类.但即使将这个事实放在一边,即使对于仅使用构造函数的简单对象,通常也不会这样做.

我所知道的最简单的例子是2-D Vector类.这么简单,但很棘手.我希望能够从笛卡尔坐标和极坐标两者构造它.显然,我做不到:

struct Vec2 {
    Vec2(float x, float y);
    Vec2(float angle, float magnitude); // not a valid overload!
    // ...
};
Run Code Online (Sandbox Code Playgroud)

我的自然思维方式是:

struct Vec2 {
    static Vec2 fromLinear(float x, float y);
    static Vec2 fromPolar(float angle, float magnitude);
    // ...
};
Run Code Online (Sandbox Code Playgroud)

其中,而不是构造函数,导致我使用静态工厂方法...这实际上意味着我正在以某种方式实现工厂模式("类成为自己的工厂").这看起来不错(并且适合这种特殊情况),但在某些情况下失败,我将在第2点中描述.继续阅读.

另一种情况:试图通过某些API的两个opaque typedef(例如不相关域的GUID,或GUID和位域)重载,类型在语义上完全不同(所以 - 理论上 - 有效的重载)但实际上它们实际上是同样的事情 - 像无符号的int或void指针.


1)Java方式

Java很简单,因为我们只有动态分配的对象.制造工厂同样简单:

class FooFactory {
    public Foo createFooInSomeWay() {
        // can be a static method as well,
        //  if we don't need the factory …
Run Code Online (Sandbox Code Playgroud)

c++ design-patterns idioms factory-method

309
推荐指数
7
解决办法
16万
查看次数

工厂模式.何时使用工厂方法?

什么时候在对象中使用工厂方法而不是Factory类是个好主意?

design-patterns factory factory-method factory-pattern

261
推荐指数
8
解决办法
14万
查看次数

246
推荐指数
8
解决办法
17万
查看次数

设计模式:工厂与工厂方法与抽象工厂

我正在从网站上阅读设计模式

在那里我读到了有关工厂,工厂方法和抽象工厂的信息,但它们很混乱,我对定义并不清楚.根据定义

Factory - 创建对象而不将实例化逻辑暴露给客户端,并通过公共接口引用新创建的对象.是Factory Method的简化版本

工厂方法 - 定义用于创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象.

抽象工厂 - 提供用于创建相关对象族的界面,而无需明确指定其类.

我还查看了关于抽象工厂与工厂方法的其他stackoverflow线程,但是那里绘制的UML图使我的理解更加糟糕.

有谁能告诉我

  1. 这三种模式如何相互不同?
  2. 什么时候用哪个?
  3. 如果可能的话,任何与这些模式相关的java示例?

java language-agnostic design-patterns factory factory-method

164
推荐指数
6
解决办法
8万
查看次数

设计模式:抽象工厂与工厂方法

注意:问题在帖子的末尾.

我已经阅读了有关Abstract Factory vs Factory Method的其他stackoverflow线程.我理解每个模式的意图.但是,我不清楚这个定义.

Factory方法定义了一个用于创建对象的接口,但是让子类决定实例化哪些接口.工厂方法允许类将实例化延迟到子类.

相比之下,抽象工厂提供了一个接口,用于创建相关或从属对象的族,而无需指定其具体类.

- John Feminella

抽象工厂看起来非常相似的工厂方法.我已经绘制了一些UML类来说明我的观点.

注意:

  • 该图来自www.yuml.com,因此它们并不完美.但它是免费服务:).
  • 图表可能不完美.我还在学习GoF设计模式.

工厂方法:

工厂方法

抽象工厂(仅1名成员):

抽象工厂(仅1名成员)

抽象工厂(更多成员):

替代文字

问题:

  1. 如果抽象工厂只有一个创建者和一个产品,它仍然是抽象工厂模式吗?(创建家庭的界面)
  2. 可以从接口创建Factory Method具体创建者还是必须来自类?(类推迟实例化到子类)
  3. 如果抽象工厂只能有一个创建者和一个产品,那么抽象工厂工厂方法之间的唯一区别是前者的创建者是一个接口而后者的创建者是一个类?

language-agnostic uml design-patterns factory-method abstract-factory

141
推荐指数
3
解决办法
6万
查看次数

抽象工厂,工厂方法,生成器

这似乎是一个问题似乎是一个骗局,但请耐心等待 - 我保证我已经阅读了相关的帖子(以及GOF书).

在我读完所有内容之后,我仍然没有清楚何时使用抽象工厂,工厂方法或构建器.我相信它会在我看到一个问题的简单例子之后陷入困境,这个问题最好由建筑商来处理,而使用抽象工厂显然是愚蠢的.

你能提供一个简单的例子,你可以清楚地使用一种模式而不是其他模式吗?

我理解,如果这个例子过于简单,可能归结为意见问题,但我希望如果有人可以,那个人就是这样.

谢谢.

language-agnostic design-patterns builder factory-method abstract-factory

32
推荐指数
2
解决办法
6446
查看次数

工厂模式 - CreateInstance静态与否?

这是关于工厂模式.我有点困惑.

我看到了createInstance()方法是静态的实现和一些非静态的实现.

有人说这取决于"风格"或"味道",有些人说它没有.维基百科说它应该是非静态的,并且http://www.dofactory.com/Patterns/PatternFactory.aspx也表示它应该是非静态的,根据Gang of Four的说法.

我的问题是:它是否依赖于风格和品味,或者它是否违反了工厂模式,如果它是以静态方式实现的?什么是对的?

design-patterns factory factory-method factory-pattern static-factory

32
推荐指数
3
解决办法
2万
查看次数