0

我正在和老师争论这是否是工厂模式。我可以得到一些你们的意见吗?

public class UrlFactory {
    private static boolean testMode;
    private static long testDate;

    public static URLConnection fetchConnection(String url) 
                                              throws IOException
    {
        URL address = new URL(url);

        if(testMode)
            return new MockURLConnection(address, testDate);
        return address.openConnection();
    }

    public static void SetTestMode(long testDate)
    {
        UrlFactory.testMode = true;
        UrlFactory.testDate = testDate;
    }

    public static void UnSetTestMode()
    {
        UrlFactory.testMode = false;
    }
}
4

2 回答 2

12

它在结构上看起来类似于工厂,但我想说它忽略了工厂模式的要点。理想情况下,工厂是可实例化和可覆盖的(例如,具有用于创建的虚拟方法)。我会推荐一个带有虚拟方法UrlFactory的非静态类的设计。fetchConnection然后,您可以拥有一个派生类MockUrlFactory,该类重写fetchConnection以返回一个MockURLConnection.

例子:

public class UrlFactory {
    public URLConnection fetchConnection(String url)
        throws IOException {
        URL address = new URL(url);
        return address.openConnection();
    }
}

public class MockUrlFactory extends UrlFactory {
    private long testDate;

    public MockUrlFactory(long testDate) {
        this.testDate = testDate;
    }

    public URLConnection fetchConnection(String url)
        throws IOException {
        URL address = new URL(url);
        return new MockURLConnection(address, testDate);
    }
}
于 2012-05-14T02:53:58.970 回答
2

正如 bobbymcr 所指出的,肯定有更好、更面向对象的方式来实现工厂模式。

但是,这并不排除您的示例本身就是工厂模式的示例。

请记住,术语“设计模式”本身有点难以定义。这意味着大多数“设计模式”也很难用具体的术语来定义。它们通常以非常笼统的术语表述,实现细节留给开发人员。事实上,这种普遍性是内置在设计模式的定义中的:

这种语言的元素是称为模式的实体。每个模式都描述了一个在我们的环境中反复出现的问题,然后描述了该问题解决方案的核心,以这样一种方式,您可以使用该解决方案一百万次,而无需两次使用相同的方式.

多次定义的松散使得对设计模式的讨论本质上是准宗教的,并且与任何宗教一样,有许多狂热者。然而,我遇到的大多数狂热者都提出了值得考虑的可靠观点,即使你没有完全坚持信仰。

话虽如此,我的宗教立场与 bobbymcr 相同。工厂方法供子类覆盖。

于 2012-05-14T03:04:29.183 回答