工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
既然说到工厂模式,简单回顾一下简单工厂模式
在简单工厂模式中,如果我们要添加一个产品,比如日产,那么除了要添加一个日产产品类还要再修改一下case分支,那么这就和开山篇 中的开闭原则冲突了,即对修改关闭,对扩展开放,工厂模式就能很好的解决这个问题。
UML图:
- Car,是产品的抽象类
- Honda,Mazda,Toyota是具体的产品
- CarFactory,是工厂抽象类
- HondaFactory,MazdaFactory,ToyotaFactory是具体的工厂类
左半拉的,产品代码不可以参考简单工厂模式 的
首先创建一个工厂抽象类
public abstract class Car2Factory {
public abstract Car createCar();
}
根据产品,创建对应的工厂
public class HondaFactory extends Car2Factory{
@Override
public Car createCar() {
return new Honda();
}
}
public class MazdaFactory extends Car2Factory {
@Override
public Car createCar() {
return new Mazda();
}
}
public class ToyotaFactory extends Car2Factory {
@Override
public Car createCar() {
return new Toyota();
}
}
好了,到此产品,工厂都创建好了,关键的来了,
public class Test {
public static void main(String[] args) {
Car2Factory car2Factory = new HondaFactory();
Car honda = car2Factory.createCar();
System.out.println(honda.getCar());
Car2Factory car2Factory1 = new MazdaFactory();
Car mazda = car2Factory1.createCar();
System.out.println(mazda.getCar());
Car2Factory car2Factory2 = new ToyotaFactory();
Car toyota = car2Factory2.createCar();
System.out.println(toyota.getCar());
}
}
好了,目的达到,新建产品的时候,不用再去管什么case分支了,扩展一个产品,再扩展一个产品工厂就好了。
上面其实是每个产品的工厂只生产自己的产品,比如,本田只生产本田的汽车,马自达生产马自达的。那么,大家是不是经常在大街上看见,什么东风XXX,广汽XXX,一汽XXXX,上汽XXXX,拿东风来说,有东风本田,东风日产,东风雪铁龙。。。。
好了,创建一个此类工厂的抽象类,等下用反射生产产品
public abstract class CarFactory {
public abstract <T extends Car> T createCar(Class<T> clzz);
}
创建东风工厂
public class DFCarFactory extends CarFactory {
@Override
public <T extends Car> T createCar(Class<T> clzz) {
Car car = null;
String classname=clzz.getName();
try {
// 通过反射来生产不同厂家的汽车
car = (Car) Class.forName(classname).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) car;
}
}
好了,测一下
public class Test {
public static void main(String[] args) {
CarFactory carFactory = new DFCarFactory();
Honda ca = carFactory.createCar(Honda.class);
System.out.println(ca.getCar());
Mazda ca1 = carFactory.createCar(Mazda.class);
System.out.println(ca1.getCar());
Toyota ca2 = carFactory.createCar(Toyota.class);
System.out.println(ca2.getCar());
}
}
OK,没问题,产品生产没问题。