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)
如果我的理解是正确的(如果错误请纠正我),为什么我们需要另一种设计模式呢?
对于您的示例,是的,您是对的,工厂模式可以替换抽象工厂模式。
当您需要创建同一个系列的不同产品而不真正了解这个系列(沃尔沃或奥迪)时,抽象工厂是有意义的。
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)
现在我们的构建器类可以在不知道实际品牌的情况下工作,这使得构建器类符合开放/封闭原则。如果将来有第三个品牌出现,我们的建造者班级仍然可以建造那辆车,而无需更改单行代码。由于抽象工厂,它对扩展开放,但对更改关闭。