O. *_*dze 5 java oop design-patterns factory-method factory-pattern
工厂方法:
嘿大家。我正在寻找简单工厂和工厂方法之间的区别。我知道结构差异(上图),但我无法理解用例的差异。例如,这是对工厂方法的解释:
在工厂方法模式中,我们将引入一个名为“IMobileFactory”的新接口和两个具体实现“NokiaFactory”和“IphoneFactory”。这些具体的类控制对象的创建。
在我的例子中,客户想要一个诺基亚对象。所以下面给出了步骤。
1.客户端将加载对“NokiaFactory”的引用。但是 Client 不会像 Simple Factory 模式那样直接引用“NokiaFactory”类。客户端通过接口“IMobileFactory”引用具体实现。
2.然后客户端调用'CreateMobile()'方法,该方法将返回一个'IMobile'类型的对象。
3.这里我们要通过一些配置或者参数告知客户端要使用的具体实现。
我无法理解第一步:
但是 Client 不会像 Simple Factory 模式那样直接引用“NokiaFactory”类。客户端通过接口“IMobileFactory”引用具体实现。
所以客户写了这样的东西:
IMobileFactory factory = LoadFactory("NokiaFactory");
Run Code Online (Sandbox Code Playgroud)
那么为什么它有用而且更好呢?有什么好处?为什么我不应该这样写:
NokiaFactory factory = new NokiaFactory();
Run Code Online (Sandbox Code Playgroud)
或者那怎么办:
IMobileFactory factory = new NokiaFactory();
Run Code Online (Sandbox Code Playgroud)
所以你的问题是关于比较这个设计#1:
IMobileFactory factory = LoadFactory("NokiaFactory");
Run Code Online (Sandbox Code Playgroud)
这个设计#2:
NokiaFactory factory = new NokiaFactory(); // or:
IMobileFactory factory = new NokiaFactory();
Run Code Online (Sandbox Code Playgroud)
如您所见,最大的区别在于,虽然设计 #1 中的客户端不知道任何具体类型,如NokiaFactory或IPhoneFactory,但设计#2 中的客户端知道。
了解诸如NokiaFactory或IPhoneFactory应该众所周知的具体事物的缺点。如果要对这些类型进行更改,例如,要向其中添加新方法NokiaFactory而该方法不是IMobileFactory接口的一部分,那么客户端代码将受到不必要的影响。客户端不关心新方法,但必须重新编译/重新部署其代码。
解释更多。
例如,Foo在NokiaFactory类中添加了一个名为的新方法:
class NokiaFactory {
// old code
public void Foo() { ... }
}
Run Code Online (Sandbox Code Playgroud)
Foo不是IMobileFactory接口的方法,而是添加到其中,NokiaFactory因为有另一个客户端需要该方法,并且该客户端很乐意依赖于NokiaFactory类。换句话说,那个客户会欢迎NokiaFactory课堂上的变化,但第一个客户不会。
从设计角度:
当对象的类型不固定时使用 SimpleFactory。例如:手机我的制造商 - 诺基亚、iPhone。可能你明天想添加一个新的制造商。
当对象类型固定时使用工厂方法。例如:电话类型 - 座机和手机。
最后,这归结为您希望如何设计您的系统。你想扩展什么。