[英]Is there a faster method for a NSLookup than InetAddress.getByName()?
[英]Is the static method getByname of InetAddress class in java an example of Factory method pattern?
标准工厂方法设计模式讲述了4个类。 Creator,Product n具体实现。
因此,对于每个产品,我们需要实例化具有创建产品的方法的相应工厂。
但是我也看到了这样的场景:人们将构造函数声明为私有的,并具有创建相同类的对象的静态方法。 类似于我们对单身人士所做的事情。
例如,getByname是InetAddress的静态方法之一,它返回其子类之一,具体取决于参数是什么。 人们称之为工厂方法。
这也是工厂方法模式的示例吗? 它是否包含if-else-if在方法内解码参数或switch语句? 但是没有使用switch n条件语句被认为是一个糟糕的OO设计实践?
是的,这是工厂方法模式的示例。
答:是的,它解析其参数并确定要实例化的地址类型(哪个子类)(这可以通过查看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");
}
而是将此逻辑封装到工厂方法中。
实际上,这是一个抽象工厂模式的示例。 我们知道它是模式的抽象版本,因为返回类型是抽象的(您可以获取Inet4Address
或Inet6Address
)
使用这种模式,条件语句( if
是s)是不可避免的,必须去某个地方,所以没关系。 “设计纳粹”可以跳跃。
通常可以通过良好的设计来避免开关,但有时候没有其他选择。 喜欢解析从系统外部插入的输入(主要是用户)。 但是对于来自您自己系统的输入,您应该考虑更好的设计或每种输入的方法(如果可能)。
例如,在这种情况下,如果您知道要处理的是IPv4或IPv6地址,则应该可以调用适当的方法,而不必去工厂。 如果只有工厂方法可用,那将是糟糕的设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.