gpt4 book ai didi

java - 抽象工厂设计模式的使用

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:42:48 25 4
gpt4 key购买 nike

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

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

这样的抽象工厂
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");

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

最佳答案

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

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

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 的类,它不关心它是 Audi 还是 Volvo。

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

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

return car;
}
}

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

关于java - 抽象工厂设计模式的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32890623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com