假设我们有两个产品,Car和Plane类,有一个属性name、一个构造方法、一个获取名称的方法,如下。
public class Car{
private String name;
public Car(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Plane {
private String name;
public Plane(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
然后我们希望客户在使用他们的时候,输入car,就创建一个Car对象,输入plane,就创建一个Plane对象。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String vehicle = scanner.nextLine();
//如果客户需要一辆汽车,就建造一辆汽车
if (vehicle.equals("car")){
Car car = new Car("奔驰");
System.out.println(car.getName());
}
if (vehicle.equals("plane")){
Plane plane = new Plane("波音");
System.out.println(plane.getName());
}
}
这样实现有一个非常麻烦的点,在使用他们的时候,需要自己去创建对象,现实生活中,飞机和汽车可能有上万个属性,使用他们的人可能根本知道如何去创建这个对象。
下面我将使用简单工厂来改造上面的代码,让使用的人无需创建对象,输入car即可获得Car对象。
1-新建一个抽象类Vehicle,并且让Car和Plane继承Vehicle,如下所示:
abstract public class Vehicle {
//公共抽象方法
public abstract String getName();
}
public class Plane extends Vehicle {
private String name;
public Plane(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
public class Car extends Vehicle {
private String name;
public Car(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
2-新建一个工厂类,使用静态方法获取具体的对象,如下:
public class Factory {
//静态工厂方法,根据传进来的值,创建具体的交通工具
public static Vehicle getVehicle(String vehicle){
Vehicle vehicleObject = null;
if (vehicle.equals("car")){
vehicleObject = new Car("奔驰");
}
if (vehicle.equals("plane")){
vehicleObject = new Plane("波音");
}
return vehicleObject;
}
}
3-改造完成之后,在客户端使用他们只需要输入car或者plane就能获取到Car和Plane对象。可以说是非常方便调用的人了。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String vehicle = scanner.nextLine();
//直接使用工厂方法获取具体的交通工具,不用自己创建了
Vehicle vObject = Factory.getVehicle(vehicle);
System.out.println(vObject.getName());
}