java中的工厂和抽象工厂设计模式有什么区别?

时间:2014-10-20 09:57:41

标签: java design-patterns

1)工厂是否由具体工厂类实现,if else检查类型并根据类型创建对象?    要么    我们有接口工厂和抽象创建方法    我们在具体工厂类中为每种不同类型的对象实现此接口,并实例化该特定类型对象的obj。

2)抽象工厂与工厂有何不同?它只是工厂的工厂吗?

3)我们如何更改创建特定类型对象的if else条件?如果我们删除if else,那么它会变成抽象工厂吗?

3 个答案:

答案 0 :(得分:2)

工厂是制作物品的一整套技术。

抽象工厂是可以为您创建对象的东西的接口。您没有指定它是如何形成的,工厂的实例有自己的方式来制作特定的对象或对象组。

工厂方法是类的一种方法,可以帮助您创建该类的实例。

您通常不在工厂中使用if / else语句,因为:

  1. 使用抽象工厂,工厂实例确定它的工作方式
  2. 使用工厂方法,您调用的特定方法决定了您正在制作的类型。
  3. 这里有一个很好的跳跃点 - http://en.wikipedia.org/wiki/Creational_pattern

答案 1 :(得分:1)

<强> How abstract factory is different from factory ?

回答你的问题是:多种方式。
首先尝试找出FactoryAbstract Factory的基础知识。
http://en.wikipedia.org/wiki/Abstract_factory_pattern
http://en.wikipedia.org/wiki/Factory_method_pattern
http://c2.com/cgi/wiki?AbstractFactoryVsFactoryMethod

Is it a factory of factory ?
 是的,你可以将抽象工厂作为工厂的工厂。

简短摘要:

  • Factory Method用于创建一个产品(更具体地说,它只是一个方法),但抽象工厂就像一个对象。您可以使用abstract factory创建相关或相关产品系列。

  • Factory方法模式向客户端公开一个方法来创建对象,而在Abstract Factory的情况下,它们公开了一系列相关对象,这些对象可能包含这些工厂方法。

  • AbstractFactory模式使用组合将创建对象的责任委托给另一个类,而Factory设计模式使用继承并依赖派生类或子类来创建对象。 p>

  • Factory模式背后的想法是它允许客户端不知道在运行时需要创建哪些具体类的情况,但是,如果您的系统必须创建多个系列的产品,或者您希望在不暴露实施细节的情况下提供产品库,那么只需要一个可以完成工作的类,同时AbstractFactory模式最佳使用。

    部分代码示例:

  • 工厂方法:

     class A {
    public void doSomething() {
        Foo f = makeFoo();
        f.whatever();   
    }
    
    protected Foo makeFoo() {
        return new RegularFoo();
    }
    }
    
    class B extends A {
    protected Foo makeFoo() {
        //subclass is overriding the factory method 
        //to return something different
        return new SuperFoo();
    }
    }
    

  • 抽象工厂:

     class A {
    private Factory factory;
    
    public A(Factory factory) {
        this.factory = factory;
    }
    
    public void doSomething() {
        //The concrete class of "f" depends on the concrete class
        //of the factory passed into the constructor. If you provide a
        //different factory, you get a different Foo object.
        Foo f = factory.makeFoo();
        f.whatever();
    }
    }
    
    interface Factory {
    Foo makeFoo();
    Bar makeBar();
    

    }

    但是我真的不明白你的if-else的目的。现在谈谈你的短语 creating particular kind of objects。是的,您可以通过将concreate类对象传递给工厂来实现,就像示例中的上述代码片段一样。

    希望这会对你有所帮助。

  • 答案 2 :(得分:0)

    您可以将Factory视为用于创建对象的API。实例化逻辑不暴露给客户端,逻辑可以用一系列&#34; if-else&#34;等实现

    当多个具体工厂可用时,抽象工厂充当单一访问点。这对于创建针对不同环境的对象是有用的,即,用于创建GUI组件的抽象工厂的实现可以动态地加载具体工厂以生成用于Windows OS的具体GUI组件。另一个具体的工厂可用于生成Linux OS的组件。