总所周知,要实例化对象,就要使用关键字new, 例如“Plane plane = new Plane()”,或许还会有一些更复杂的初始化代码,这样构造的结果会使飞机对象的产生代码被牢牢的硬编码在客户端中,也就是客户端与实例化的强耦合。事实上我们完全不必关心产品的制造过程(实例化、初始化),将这个任务交由相应的工厂全权负责,工厂最终能交付产品供我们使用即可,如此我们便摆脱了产品生产方式的束缚,实现了与制造过程彻底解耦。
下面拿特斯拉工厂举例:
特斯拉汽车在上海有一座工厂,用来生产特斯拉汽车,特斯拉汽车下面有两种型号的汽车,一种叫ModelX,一种叫ModelY,他们都具有价格与名字,都能能行驶,这样我们就抽象出一个Vehicle类:
public abstract class Vehicel {
private int price;
private String name;
public Vehicel(int price, String name) {
this.price = price;
this.name = name;
}
public abstract void run();
}
ModelX与ModelY继承了Vehicle类:
public class ModelX extends Vehicel{
public ModelX(int price, String name) {
super(price, name);
}
@Override
public void run() {
System.out.println("Model X is running");
}
}
public class ModelY extends Vehicel {
public ModelY(int price, String name) {
super(price, name);
}
@Override
public void run() {
System.out.println("Model Y is running!");
}
}
创建一个特斯拉汽车工厂接口(制作规范)TeslaFactory,告诉特斯拉汽车都要这样造
public interface TeslaFactor {
public Vehicel createVehicle(int price, String name);
}
生产ModelX与ModelY的工厂分别为ModelXFactory与ModelYFactory,这两座工厂都按照TeslaFactory提供的生产规范去生产Tesla汽车
public class ModelX extends Vehicel{
public ModelX(int price, String name) {
super(price, name);
}
@Override
public void run() {
System.out.println("Model X is running");
}
}
public class ModelY extends Vehicel {
public ModelY(int price, String name) {
super(price, name);
}
@Override
public void run() {
System.out.println("Model Y is running!");
}
}
客户只需要从与ModelX与ModelY相对应的工厂提车就可以了,不用了解特斯拉汽车是怎么造出来的。
public class Client {
public static void main(String[] args) {
TeslaFactor Tesla = new ModelXFactory();
Tesla.createVehicle(230000, "ModelX").run();
Tesla = new ModelYFactory();
Tesla.createVehicle(180000, "ModelY").run();
}
}
执行结果:
Model X is running! Model Y is running!
下面是特斯拉工厂的类图:



