【发布时间】:2018-08-16 08:41:36
【问题描述】:
与简单工厂相比,我试图了解何时使用工厂方法模式,我知道每种方法是如何实现的,但我并不完全明白它的重点。
假设我有提供字符串(汽车名称)的客户端,并且基于该字符串,工厂提供对象。
我知道方法工厂满足开/关原则,如果我有新的汽车品牌,例如梅赛德斯,我将不得不编辑开关盒并添加新品牌,那将是不好的做法。但是使用工厂方法,我的工厂无法决定制作哪个对象,因为没有开关盒。我想我在这里遗漏了一点。如果我在创建汽车对象时有不同的逻辑/策略,也许我应该使用工厂方法,也许一种制造随机汽车对象,一种采用字符串并基于该字符串制造对象。
如果我在工厂方法 getCar() 函数中使用并在那里执行更多逻辑,例如 car.tuneEngine() 等,在返回准备好使用的对象之前,这也是一个好习惯吗?
简单工厂
public class FordCar extends Car {
public FordCar() {
super("Ford", "Mondeo", 1.6);
// TODO Auto-generated constructor stub
}
@Override
public void move() {
System.out.println("Ford moves");
}
}
public class CarFactory {
public Car getCar(String brand) {
switch (brand) {
case "ferrari":
return new FerrariCar();
case "ford":
return new FordCar();
default:
return null;
}
}
}
public class Client {
public static void main(String[] args) {
//Simple factory
CarFactory carFactory = new CarFactory();
Car clientSimpleCar = carFactory.getCar("ford");
clientSimpleCar.move();
}
}
工厂方法模式
public abstract class CarMethodFactory {
public Car getCar(){
Car car = createCar();
return car;
}
public abstract Car createCar();
}
public class FordMethodFactory extends CarMethodFactory{
@Override
public Car createCar() {
return new FordCar();
}
}
public class Client {
public static void main(String[] args) {
CarMethodFactory carMethodFactory = new FordMethodFactory();
Car clientMethodCar = carMethodFactory.getCar();
clientMethodCar.move();
}
}
【问题讨论】:
-
你的模式都错了——首先确实是工厂,其次是抽象工厂模式。通过方法工厂,我假设您的意思是静态方法工厂模式 - 以上都不是。
-
@BoristheSpider 第二个是抽象工厂吗?抽象工厂用于对象族。在他的示例中只有一种对象,即 Car。工厂方法模式具有抽象的创建功能,这让大多数人误以为它是抽象工厂模式。所以,他的例子很重要。
标签: java design-patterns