工厂模式的真正优势

5

我已经使用工厂模式一年了。有时我觉得真正的优点只是代码更加清晰易懂。让我解释一下,

interface A {

    public void test();
}

class B implements A {
    public void test() {

    }
}

class C implements A {
    public void test() {

    }
}

class Factory {
    public static A getObject(String name){
        if(name.equalsIgnoreCase("B")){
            return new B();
        }else if(name.equalsIgnoreCase("C")){
          return new C();
        }
        return new B(); 

    }
}

public class Test {

    public static void main(String[] args) {
        A a = Factory.getObject(args[0]);

        // if i dint use factory pattern
        A nofactory=null;
        if(args[0].equalsIgnoreCase("B")){
            nofactory= new B();
        }else if(args[0].equalsIgnoreCase("C")){
            nofactory= new C();
        }
    }
}

从上述代码中,我感觉工厂模式只是让代码更加美观,如果我的理解有误,请告诉我。


4
将JDBC视为经典的学校例子。它是一个工厂模式。它允许您通过仅更换JDBC驱动程序(其实现是通过工厂加载的)在不同的数据库上使用相同的JDBC代码。 - BalusC
1
相关/可能重复:https://dev59.com/e2sz5IYBdhLWcg3w9soQ#7550752 - BalusC
3
问题是什么? - Adam Arold
1
“Just”只是美化代码的吗?你还需要什么?可以说所有的设计模式都是为了美化代码。 - Marko Topolnik
1
@MarkoTopolnik 虽然我不太同意这个观点。有些模式是基本问题的强大解决方案。它们使您的代码具有可扩展性,而不仅仅是更美观。虽然我确实喜欢优美的代码 =) - Ludwig Magnusson
@LudwigMagnusson 不是 Factory 做同样的事情吗?因此,如果您接受“美化”的定义涵盖了 Factory 所做的事情,那么我们可以认为所有其他模式都是关于同一种“美化”的。 - Marko Topolnik
3个回答

2
如果接口 A 和类 BC 在一个库中,而你的代码是使用该库的主方法,那么意味着类 DE等可以添加到该库中,而你可以在不改变代码的情况下使用它们。选择使用哪种实现的责任转移到了库上。
另外,你的示例非常简单。有时输入可能比与类型完全匹配的字符串更复杂。例如,输入可能是具有特定格式的文件,需要某种实现才能读取。

从答案中我可以得出工厂模式将创建对象的关注点与组合对象分离,这也增加了抽象性。 - Ashwin
我确实不太明白你的意思,但是是的,创建对象的问题留给工厂处理,并且隐藏在其他代码之外。其他代码可以信任工厂返回一个正确的对象。 - Ludwig Magnusson

1

不要只考虑美化,看以下示例:

假设您正在实现测试类,而您的合作伙伴正在实现B、C、D等(其他您不知道的部分)... 您如何管理这些?

工厂模式可以帮助您编写应用程序的一部分,而无需了解其其他部分。


0

我认为在DP书中有一个意图部分,它比模式本身的结构更重要。 你的示例足够简单。在更复杂的情况下,工厂可以帮助您封装创建细节。 以您的示例为例。想象一下,在您的代码中散布着“new B()”和“new C()”。 然后,您需要将B更改为SuperB类型,并且您必须在代码的每个地方都进行更改。 在工厂中,您只需更改一个地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接