1

标准工厂方法设计模式涉及 4 个类。Creator,Product n 他们的具体实现。

因此,对于每个产品,我们需要实例化相应的工厂,该工厂具有创建产品的方法。

但我也看到过人们将构造函数声明为私有并拥有创建同一类对象的静态方法的场景。类似于我们对单例所做的事情。

例如 getByname 是 InetAddress 的静态方法之一,它根据参数返回其子类之一。人们称之为工厂方法。

这也是工厂方法模式的一个例子吗?它是否在方法中包含 if-else-if 来解码参数或 switch 语句?但是使用 switch n 条件语句不被认为是糟糕的 OO 设计实践吗?

4

3 回答 3

2

是的,这是工厂方法模式的一个例子。

是的,它解析它的参数并决定实例化哪种地址(哪个子类)(这很容易通过查看 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");
}

相反,这个逻辑被封装到工厂方法中。

于 2011-12-26T10:34:23.043 回答
1

实际上,这是一个抽象工厂模式的例子。我们知道这是模式的抽象版本,因为返回类型是抽象的(你可以得到 aInet4AddressInet6Address

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

于 2011-12-26T10:37:55.720 回答
0

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

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

于 2011-12-26T10:36:56.937 回答