标准工厂方法设计模式涉及4个类。 Creator,Product n具体实现。
因此,对于每个产品,我们需要实例化具有创建产品方法的相应工厂。
但我也看到过一些场景,人们将构造函数声明为私有,并且有一个静态方法可以创建同一个类的对象。类似于我们对单身人士的做法。
例如,getByname是InetAddress的静态方法之一,它返回一个子类,具体取决于参数是什么。 人们称之为工厂方法。
这也是工厂方法模式的一个例子吗? 它是否包含if-else-if在方法内解码参数或switch语句? 但是没有使用switch n条件语句被认为是一个糟糕的OO设计实践吗?
答案 0 :(得分:2)
是的,这是工厂方法模式的一个示例。
Ans是的,它解析它的参数并决定实例化哪种地址(哪个子类)(通过查看JDK附带的方法的源代码可以很容易地找到它。)
在某些时候,您必须使用条件语句。这不一定是不好的做法。在这种情况下,工厂方法恰好在那里封装地址解析并返回适当的子类,而不是必须在调用者中执行。什么是坏的OO实践将被迫写:
int addressType = InetAddress.getAddressType(address);
InetAddress ia = null;
switch (addressType) {
case V4 :
ia = new Inet4Address();
break;
case V6 :
ia = new Inet6Address();
break;
default :
throw new RuntimeException("bad address");
}
相反,这个逻辑被封装到工厂方法中。
答案 1 :(得分:1)
实际上,它是Abstract Factory Pattern的一个例子。我们知道它是模式的抽象版本,因为返回类型是抽象的(您可以获得Inet4Address
或Inet6Address
)
使用这种模式,条件语句(if
s)是不可避免的,必须去某个地方,所以没关系。 “设计纳粹”可以跳跃。
答案 2 :(得分:0)
通常可以通过良好的设计来避免开关,但有时候没有其他选择。喜欢解析从系统外部插入的输入(主要是用户)。但是对于来自您自己系统的输入,您应该考虑为每种输入设置更好的设计或方法(如果可能的话)。
例如,在这种情况下,如果您知道自己是在处理IPv4或IPv6地址,那么您应该能够调用approperiate方法而不是去工厂。如果只有工厂方法可用,那将是糟糕的设计。