定义一个用于创建对象的接口,让子类决定实例化哪个类。
Activity的onCreate方法相当于工厂方法
使用场景
① 需要创建复杂对象时。
代码实现
实现的几个角色:
1.AbstractFactory抽象工厂类
2.TruckFactory具体工厂类
3.AbstractCar抽象产品类
4.Truck具体的产品类
简单实现:
① AbstractFactory
public abstract class AbstractFactory {
public abstract <T extends AbstractCar> T createCar(Class<T> clz);
}
② AbstractCar
public abstract class AbstractCar {
abstract void start();
}
③ Truck
public class Truck extends AbstractCar {
@Override
void start() {
System.out.print("货车启动了");
}
}
④ Bus
public class Bus extends AbstractCar {
@Override
void start() {
System.out.print("客车启动了");
}
}
⑤ TruckFactory
public class TruckFactory extends AbstractFactory {
@Override
public <T extends AbstractCar> T createCar(Class<T> clz) {
AbstractCar abstractCar = null;
try {
abstractCar = (AbstractCar) Class.forName(clz.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) abstractCar;
}
}
⑥ 测试输出
public class Client {
public static void main(String[] args){
AbstractFactory factory = new TruckFactory();
AbstractCar abstractCar = factory.createCar(Truck.class);
abstractCar.start();
AbstractCar abstractCar2 = factory.createCar(Bus.class);
abstractCar2.start();
}
}
简单实现(静态工厂模式)
当只有一个工厂时
public class StaticFactory {
public static <T extends AbstractCar> T createCar(Class<T> clz){
AbstractCar car = null;
try {
car = (AbstractCar) Class.forName(clz.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) car;
}
}
优缺点
① 结合反射、泛型、继承抽象达到简洁、动态
【缺点】在添加新的产品时,需要编写新的产品类以及引入抽象层,会导致类结构复杂化。