当前位置: 首页 > 面试题库 >

抽象工厂和工厂设计模式之间有什么区别?

巫马欣嘉
2023-03-14
问题内容

我知道有很多关于这两种模式之间差异的文章,但是有些事情我找不到。

从我阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但是将实现隐藏给客户端,因为他们将看到通用产品。我的第一个问题是关于抽象工厂。它的作用是允许您在其中创建具体对象系列(取决于您使用的是哪个特定工厂),而不仅仅是一个具体对象吗?抽象工厂是否只返回一个非常大的对象或取决于调用的方法的许多对象?

我的最后两个问题是关于一个引号,我无法完全理解我在很多地方都看到过的情况:

两者之间的区别是,在使用抽象工厂模式时,一个类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式则使用继承并依赖于子类来处理所需的对象实例化。

我的理解是,工厂方法模式具有一个Creator接口,它将使ConcreteCreator负责知道要实例化哪个ConcreteProduct。这是使用继承处理对象实例化的意思吗?

现在关于那句话,抽象工厂模式到底如何通过组合将对象实例化的责任委托给另一个对象?这是什么意思?在我看来,抽象工厂模式也使用继承来完成构造过程,但是我仍然在学习这些模式。

任何帮助,特别是最后一个问题,将不胜感激。


问题答案:

两者之间的区别

“工厂方法”和“抽象工厂”之间的主要区别在于工厂方法是单一方法,而抽象工厂是对象。我认为很多人将这两个术语弄混了,并开始互换使用。我记得当我学习它们时,我很难找到确切的区别。

因为factory方法只是一个方法,所以可以在子类中覆盖它,因此引号的后半部分:

…工厂方法模式使用继承,并依赖于子类来处理所需的对象实例化。

引用假定此处对象正在调用 其自己的 工厂方法。因此,唯一可以更改返回值的是子类。

抽象工厂是一个具有多种工厂方法的对象。查看报价的前半部分:

…使用Abstract Factory模式,一个类通过组合将对象实例化的责任委托给另一个对象…

他们在说的是,有一个对象A,他想制作一个Foo对象。与其创建Foo对象本身(例如,使用工厂方法),不如创建 另一个 对象(抽象工厂)来创建Foo对象。

程式码范例

为了说明不同之处,以下是使用的工厂方法:

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 SpecialFoo();
    }
}

这是一个正在使用的抽象工厂:

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();
    Aycufcn makeAmbiguousYetCommonlyUsedFakeClassName();
}

//need to make concrete factories that implement the "Factory" interface here


 类似资料:
  • 4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 。 Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。 抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 cr

  • 本文向大家介绍简单工厂和抽象工厂有什么区别?相关面试题,主要包含被问及简单工厂和抽象工厂有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 简单工厂:用来生产同一等级结构中的任意产品,对于增加新的产品,无能为力。 工厂方法:用来生产同一等级结构中的固定产品,支持增加任意产品。 抽象工厂:用来生产不同产品族的全部产品,对于增加新的产品,无能为力;支持增加产品族。

  • 本文向大家介绍Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】,包括了Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java设计模式之工厂模式。分享给大家供大家参考,具体如下: 一、 简单工厂 先来思考一个问题。我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建

  • 工厂-创建对象而不向客户机公开实例化逻辑,并通过公共接口引用新创建的对象。是工厂方法的简化版本 工厂方法-定义一个创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象。 抽象工厂-提供了创建相关对象家族的接口,而无需显式指定它们的类。 null

  • 本文向大家介绍C++设计模式之抽象工厂模式,包括了C++设计模式之抽象工厂模式的使用技巧和注意事项,需要的朋友参考一下 问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理;由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法模式中,每个工厂只能创建单一种类的产品,当需要生产一种全新的

  • 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。