Java 这不是工厂模式吗?

Java 这不是工厂模式吗?,java,factory-pattern,Java,Factory Pattern,我正在和我的老师争论这是否是一种工厂模式。我能听听你们的意见吗 public class UrlFactory { private static boolean testMode; private static long testDate; public static URLConnection fetchConnection(String url) throws IOExce

我正在和我的老师争论这是否是一种工厂模式。我能听听你们的意见吗

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;
    }
}

它在结构上看起来与工厂相似,但我认为它没有抓住工厂模式的要点。理想情况下,工厂是可实例化和可重写的,例如,具有用于创建的虚拟方法。我推荐一种设计,其中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);
    }
}

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

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

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

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

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


尽管如此,我的宗教立场和博比姆的是一样的。工厂方法是供子类重写的。

可能是您的老师抱怨在实际生成URLConnection对象时将其称为URLFactory吗?为什么您的老师说它不是工厂?我想这可能被归类为工厂模式的实现,尽管它很差。别和你的老师争论,即使你不同意:这通常很像逆风撒尿。我没有得到解释为什么这不是一门工厂课程,但这个实践让我从100%=a变成了74%=D,我敢肯定这是一个工厂实践。你能用代码告诉我你在做什么吗?我觉得有点难以想象你的意思。它实际上不是连接工厂吗?我希望从UrlFactory创建url。