4

当我在阅读工厂时,首先在设计模式书上抽象了工厂设计模式。它提到了这句话。

你能否举一个基本的例子和解释来澄清它。

4

3 回答 3

14

依赖倒置原则;五个面向对象设计原则之一。查看这个问题的答案;“什么是依赖倒置原则,为什么它很重要?” - 那里有一些非常好的信息。

在传统的应用程序架构中,较低级别的组件被设计为由较高级别的组件使用,从而能够构建越来越复杂的系统。在这种组合中,高级组件直接依赖于低级组件来完成某些任务。这种对低层组件的依赖限制了高层组件的重用机会。

用“简单”的术语来说,这意味着当您依赖对象的具体实例时 - 您正在构建对代码的依赖关系(尽管没有这种意图),这会限制重用它的能力。

请记住,具体类型是可以实例化的类类型,而抽象类型是不能实例化的类型;即一个界面。(见分类分类

如果您对特定的具体类进行编码,那么您将始终需要该类。但是,如果您对接口(抽象)进行编码,则可以调整您的代码以与任意数量的类一起使用;只要他们实现了那个通用接口。

因此,在 Java 中,这意味着您应该尽可能对接口进行编码 - 并避免使您的代码依赖于特定项目。这通常就像传递Interface类型作为参数和返回类型一样简单;与具体类相反。

更少的依赖 = 更多的代码重用能力。更多的依赖=更多的要求能够重用代码。

当您学习设计模式时,这将是一个反复出现的主题!

维基百科上的依赖倒置原则

于 2012-11-25T15:37:51.687 回答
2

因为工厂是虚拟构造函数。它们使您能够在运行时返回不同的类型。工厂依赖于多态性。

如果你返回具体类型,你就不能做任何这样的事情。

public interface IFoo {
    void execute();
}

public class Bar implements IFoo {
    public void execute() { System.out.println("Bar does one thing"); }
}

public class Baz implements IFoo {
    public void execute() { System.out.println("Baz does another"); }
}

public class FooFactory { 
    private static final FooFactory instance = new FooFactory(); 

    private FooFactory() {}

    public static final FooFactory getInstance() { return instance; }

    public IFoo create(Class clazz) { 
        return clazz.newInstance();
    }
}

很明显,如果您Bar从 create 方法返回 a ,则 aBaz是不可能的,反之亦然。界面是关键。

于 2012-11-25T15:31:57.500 回答
1

依赖抽象可能会帮助您在类之间获得松耦合。这就是为什么它被建议。考虑一个示例Animal类。如果您可以通过其定义保留许多抽象,那么当您定义更具体的类(例如Dog和)时,您将具有更大的弹性Bird。如果你把一个具体的特性Dog放在里面Animal,那么你在尝试编写Bird扩展时就会发生冲突Animal。所以总是将事物抽象到类层次结构的上层。

于 2012-11-25T15:35:02.403 回答