抽象工厂设计模式的使用

Jom*_*rge 3 java design-patterns abstract-factory

我正在尝试学习创建型设计模式,我想我现在了解工厂方法模式。但是在转向抽象工厂模式时,我找不到它的用途。我知道我想念这个,但不知道在哪里。

在抽象工厂模式中,我们将有一个抽象工厂,具体工厂将返回实例。假设我们正在处理汽车的创建。我们将有一个抽象工厂,比如

public interface CarFactory{
    public Car getCar();
}
Run Code Online (Sandbox Code Playgroud)

我们的具体工厂将类似于

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

public class VolvoFactory{
    public Car getCar(){
        return new Volvo();
    }
}
Run Code Online (Sandbox Code Playgroud)

在用户类中,我们将像这样使用它

CarFactory factory = new AudiFactory();
Car carAudi = factory.getCar();
factory = new VolvoFactory();
Car carVolvo = factory.getCar();
Run Code Online (Sandbox Code Playgroud)

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

public class CarFactory{

    public Car getCar(String make){
    if("Audi".equals(make))
        return new Audi();
    else if("Volvo".equals(make))
        return new Volvo();
    }
}
Run Code Online (Sandbox Code Playgroud)

在用户类中我们可以

CarFactory factory = new CarFactory();
Car carAudi = factory.getCar("Audi");
Car carVolvo = factory.getCar("Volvo");
Run Code Online (Sandbox Code Playgroud)

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

Meh*_*taş 5

对于您的示例,是的,您是对的,工厂模式可以替换抽象工厂模式。

当您需要创建同一个系列的不同产品而不真正了解这个系列(沃尔沃或奥迪)时,抽象工厂是有意义的。

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(); }
}
Run Code Online (Sandbox Code Playgroud)

我相信你可以为沃尔沃想象同样的事情。

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

class CarBuilder {
    public static Car buildCar(ICarFactory factory) {
        Car car = factory.createCar();

        car.setEngine(factory.createEngine());
        car.setGear(factory.createGear());

        return car;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们的构建器类可以在不知道实际品牌的情况下工作,这使得构建器类符合开放/封闭原则。如果将来有第三个品牌出现,我们的建造者班级仍然可以建造那辆车,而无需更改单行代码。由于抽象工厂,它对扩展开放,但对更改关闭。