当前位置: 首页 > 知识库问答 >
问题:

抽象工厂设计模式的使用

呼延俊良
2023-03-14

我正在努力学习创造性设计模式,我想我现在理解了工厂方法模式。但在转向抽象工厂模式时,我找不到它的用途。我知道我错过了一些东西,但不知道在哪里。

在抽象工厂模式中,我们将有一个抽象工厂,混凝土工厂将返回实例。假设我们正在处理汽车的创建。我们将有一个像这样的抽象工厂

public interface CarFactory{
    public Car getCar();
}

我们的混凝土工厂将是

public class AudiFactory{
    public Car getCar(){
        return new Audi();
    }
}

public class VolvoFactory{
    public Car getCar(){
        return new Volvo();
    }
}

在用户类中,我们将像

CarFactory factory = new AudiFactory();
Car carAudi = factory.getCar();
factory = new VolvoFactory();
Car carVolvo = factory.getCar();

我认为我们也可以使用工厂模式构建相同的功能

public class CarFactory{

    public Car getCar(String make){
    if("Audi".equals(make))
        return new Audi();
    else if("Volvo".equals(make))
        return new Volvo();
    }
}

在用户类中,我们可以

CarFactory factory = new CarFactory();
Car carAudi = factory.getCar("Audi");
Car carVolvo = factory.getCar("Volvo");

如果我的理解是正确的(如果它是错误的,请纠正我),为什么我们需要另一种设计模式呢?

共有3个答案

蔡弘扬
2023-03-14

您已经很好地理解了工厂模式的使用:工厂允许tou创建在编译时类型未知的对象(只是corse接口的一个子类)。现在,让我们走出一步:

现在您有一个CarFactory来创建Car对象。但是,当您的程序中同时需要多个工厂时,您将如何管理?

这就是抽象工厂的由来:抽象工厂是工厂的工厂,允许您创建在编译时类型未知的工厂:因此,您将

public interface AbstractCarFactory
{
    public CarFactory getCarFactory(String area);
}

...并且您将能够实施欧洲汽车工厂、美国汽车工厂等。

抽象工厂何时有用的另一个例子是当您在其构造函数中拥有一些带有参数的工厂类时:

public CarFactory
{
    public CarFactory(boolean cheatingMotor) {...}
}

很难通过动态实例化(Class.forName("CarFactory"). newInstance())创建一个CarFactory对象,因此向上一个层次的分解是有用的:一个决定如何实例化CarFactory的抽象工厂:

public interface AbstractCarFactory
{
    public CarFactory(boolean cheatingMotor);
}

public class MyAbstractCarFactory implements AbstractFactory
{
    public CarFactory(boolean cheatingMotor)
    {
        return new CarFactory(true);
    }
}

注意:在常见的应用程序中,抽象工厂模式足以正确地参数化所有应用程序的行为。我从来不知道需要工厂的工厂的实例。

寇宏义
2023-03-14

在你的例子中:

>

  • 工厂方法模式是创建汽车的模式(隐藏汽车创建的实现)

    摘要工厂模式是创建汽车工厂的模式(汽车工厂创建,而不是汽车创建,专注于工厂创建)

    所以你可以认为:抽象工厂模式是创建工厂的模式

    这两种模式的用途不同。

    抽象工厂模式(使用接口/抽象实现)IoC模式-

  • 潘秦斩
    2023-03-14

    举个例子,你是对的,工厂模式可以取代抽象工厂模式。

    当您需要在不实际了解家族(沃尔沃或奥迪)的情况下创建同一家族的不同产品时,抽象工厂是有意义的。

    interface Car {}
    interface Engine {}
    interface Gear {}
    
    interface ICarFactory {
        Car createCar();
        Engine createEngine();
        Gear createGear();
    }
    
    class AudiCar implements Car {}
    class AudiEngine implements Engine {}
    class AudiGear implements Gear {}
    
    class AudiFactory implements ICarFactory {
        public Car createCar() { return new AudiCar(); }
        public Engine createEngine() { return new AudiEngine(); }
        public Gear createGear() { return new AudiGear(); }
    }
    

    我相信你也可以想象沃尔沃的情况。

    现在假设我们有一个构建Car的类,这并不关心它是奥迪还是沃尔沃。

    class CarBuilder {
        public static Car buildCar(ICarFactory factory) {
            Car car = factory.createCar();
    
            car.setEngine(factory.createEngine());
            car.setGear(factory.createGear());
    
            return car;
        }
    }
    

    现在我们的builder类可以在不知道实际品牌的情况下工作,这使得builder类符合开放/封闭原则。如果将来有第三个品牌出现,我们的builder类仍将能够在不需要更改单行代码的情况下生产这辆车。由于抽象工厂的存在,它可以扩展,但不能更改。。

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

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

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

    • 本文向大家介绍JavaScript设计模式之抽象工厂模式介绍,包括了JavaScript设计模式之抽象工厂模式介绍的使用技巧和注意事项,需要的朋友参考一下 抽象工厂模式说明 1. 工厂方法模式的问题: 在工厂方法模式里,创建类都需要通过 工厂类,如果要扩展程序,就必须修改工厂类,这违背了闭包原则,对扩展开放,对修改关闭;对于设计有一定的问题。 2. 如何解决:就要用到抽象工厂模式,就是对功能类单独

    • 主要内容:介绍,实现,Shape.java,Rectangle.java,Square.java,Circle.java,Color.java,Red.java,Green.java,Blue.java,AbstractFactory.java,ShapeFactory.java,ColorFactory.java,FactoryProducer.java,AbstractFactoryPatternDemo.java抽象工厂模式(Abstract Factory Pattern)是围绕一个超级

    • 抽象工厂模式 亦称: Abstract Factory 意图 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。 问题 假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示: 1、一系列相关产品, 例如 椅子Chair 、 ​ 沙发Sofa和 咖啡桌Coffee­Table 。 2、系列产品的不同变体。 例如, 你可以使用 现代Modern 、 ​