首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单工厂与工厂方法

简单工厂与工厂方法
EN

Stack Overflow用户
提问于 2018-11-19 10:04:24
回答 3查看 3.1K关注 0票数 5

简单工厂:

工厂方法:

大家好。我在寻找简单工厂和工厂方法之间的区别。我知道结构上的差异(上图),但我无法理解用例中的差异。例如,这是对工厂方法的解释:

在工厂方法模式中,我们将介绍一个名为“IMobileFactory”的新接口和两个具体实现的‘NokiaFactory’和‘IphoneFactory’。这些具体的类控制对象的创建。 在我的示例中,客户端需要一个Nokia对象。下面给出了这些步骤。 1.客户端将加载对“NokiaFactory”的引用。但是客户端不会像简单工厂模式那样直接引用‘NokiaFactory’类。客户端通过接口“IMobileFactory”引用具体实现。 2.然后客户端调用‘CreateMobile()’方法,该方法将返回一个类型为‘IMobile’的对象。 3.在这里,我们必须通知客户通过某些配置或参数使用的具体实现。

我不明白第一步:

但是客户端不会像简单工厂模式那样直接引用‘NokiaFactory’类。客户端通过接口“IMobileFactory”引用具体实现。

所以客户端写了这样的东西:

代码语言:javascript
复制
IMobileFactory factory = LoadFactory("NokiaFactory");

那为什么这样更有用更好呢?有什么好处?为什么我不直接写这个

代码语言:javascript
复制
NokiaFactory factory = new NokiaFactory();

那又如何呢:

代码语言:javascript
复制
IMobileFactory factory = new NokiaFactory();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-19 10:35:40

所以你的问题是比较一下这个设计#1:

代码语言:javascript
复制
IMobileFactory factory = LoadFactory("NokiaFactory");

对于这个设计#2:

代码语言:javascript
复制
NokiaFactory factory = new NokiaFactory(); // or:
IMobileFactory factory = new NokiaFactory();

正如您所看到的,最大的区别是,虽然设计#1中的客户机不知道而不是知道任何具体类型,比如NokiaFactoryIPhoneFactory,但是设计#2中的客户机知道。

了解NokiaFactoryIPhoneFactory这样的具体事物的缺点应该众所周知。如果您想对这些类型进行更改,例如,您希望向unnecessarily.中添加一个新方法,并且此方法不是IMobileFactory接口的一部分,则客户端代码将受到影响。客户端不关心新方法,但它的代码必须重新编译/重新部署。

更新

来解释更多。

例如,将名为Foo的新方法添加到NokiaFactory类中:

代码语言:javascript
复制
class NokiaFactory {
    // old code
    public void Foo() { ... }
}

Foo不是IMobileFactory接口的方法,但它被添加到NokiaFactory中,因为还有另一个客户端需要该方法,而且该客户端很乐意依赖于NokiaFactory类。换句话说,该客户端将欢迎来自NokiaFactory类的更改,但第一个客户机不会。

票数 6
EN

Stack Overflow用户

发布于 2018-11-19 11:12:21

从设计角度看:

  • 当对象类型不固定时使用SimpleFactory。例如:我的手机制造商-诺基亚,iPhone。也许你明天想增加一家新的制造商。
  • 当对象类型固定时使用Factory方法。例如:电话按类型-固定电话和移动电话。

最后,这取决于您希望如何设计您的系统。你想要扩展的东西。

票数 5
EN

Stack Overflow用户

发布于 2018-11-19 10:10:55

您需要接口以避免每种类型创建不同的流,对于10种类型,您将有1行代码,而不是10行代码。

代码语言:javascript
复制
IMobileFactory factory = loadFactory(myFactoryName);

而不是每种类型:

代码语言:javascript
复制
NokiaFactory factory = new NokiaFactory();
...
IphoneFactory factory = new IphoneFactory();
...

loadFactory方法用于new NokiaFactory()的区别在于,不需要显式创建新对象,而是将创建对象委托给返回相关对象的loadFactory

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53372254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档