繁体   English   中英

java中InetAddress类的静态方法getByname是Factory方法模式的一个例子吗?

[英]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");
}

而是将此逻辑封装到工厂方法中。

实际上,这是一个抽象工厂模式的示例。 我们知道它是模式的抽象版本,因为返回类型是抽象的(您可以获取Inet4AddressInet6Address

使用这种模式,条件语句( if是s)是不可避免的,必须去某个地方,所以没关系。 “设计纳粹”可以跳跃。

通常可以通过良好的设计来避免开关,但有时候没有其他选择。 喜欢解析从系统外部插入的输入(主要是用户)。 但是对于来自您自己系统的输入,您应该考虑更好的设计或每种输入的方法(如果可能)。

例如,在这种情况下,如果您知道要处理的是IPv4或IPv6地址,则应该可以调用适当的方法,而不必去工厂。 如果只有工厂方法可用,那将是糟糕的设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM