模式定义:提供创建对象的接口。包括工厂方法和抽象工厂方法两种。
为什么使用工厂模式呢?
工厂模式相当于new一个对象,但是它可以为你的系统带来更大的扩展性和更小的修改量。
情景一:
有一个汽车类Car
public class Car{
public Car() {
设置汽车形状
设置汽车颜色
......
}
}
Car对象的初始化有很多工作要做,这样不利于以后代码的修改,可以利用工厂模式来使大量的初始化工作从构造器中分离出来。
情景二:
有一个工厂类,生产飞机、火车、汽车...每个对象都要实例化一次,而且汽车的种类是在不断更新增长的,如果用工厂模式,这些因素引发的程序改动就会很小。
工厂方法:
继续上面的例子,将交通工具抽象成Machine接口,不同种类的交通工具实现Machine接口。
建立一个工厂
public class Factory {
public static final int TYPE_PLANE = 0;
public static final int TYPE_TRAIN = 1;
public static final int TYPE_CAR = 2;
public static Machine createMachine(int which) {
if (TYPE_PLANE == which) {
return new Plane();
} else if (TYPE_TRAIN == which) {
return new Train();
} else if (...) { ... }
return null;
}
}
现在需要实例化一辆汽车的话,就是用 CarFactory.createMachine(Factory.TYPE_CAR);
进一步,稍微复杂一点的话,就是工厂类也有它的实现类。
抽象工厂:
上面的工厂中可以制造各种交通工具,假设现在出现了很多家公司找这家工厂代工,就需要为不同的品牌贴牌。
品牌:大众、奥迪、宝马、奔驰...
现在,我们需要抽象出一个Factory:
public abstract class Factory{
public abstract Plane createPlane();
public abstract Train createTrain();
public abstract Car createCar() ;
}
大众贴牌工厂
public class VolkswagenFactory extends Factory{
public abstract Plane createPlane() {
setTag();
}
public abstract Train createTrain() {
setTag();
}
public abstract Car createCar() {
setTag();
}
private void setTag() {
System.out.println("为大众贴牌");
}
}
其他品牌的工厂类似。