1. 工厂方法模式介绍
工厂方法模式是创建型设计模式之一。定义一个用于创建对象的接口,让子类决定实例化哪个类。
2. 工厂方法模式使用场景
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。
个人理解:一般用在公共方法为外部提供创建对象的功能时,比如,汽车制造,包括Q3、Q5、Q7,都有自己的实现对象,那么就可以提供一个工厂方法,用来统一创建不同的车型对象。
3. 工厂方法模式实现
public abstract class AudioCar {
public abstract void drive();
public abstract void selfNavi();
}
public class AudiCarQ3 {
@Override
public void drive() {
System.out.println("Q3 启动");
}
@Override
public void selNavi() {
System.out.println("Q3 自动巡航");
}
}
public class AudiCarQ5 {
@Override
public void drive() {
System.out.println("Q5 启动");
}
@Override
public void selNavi() {
System.out.println("Q5 自动巡航");
}
}
(1) 基础实现方式
public abstract class AudiFactory {
public abstract AudiCar createAudiCar();
}
public class AudiFactoryImpl extends AudiFactory {
@Override
public AudiCar createAudiCar() {
return new AudiCarQ3();
// return new AudiCarQ5();
}
}
这种方式创建不同对象都需要更改工厂方法的代码,使用场景很少
还有一种是创建不同的工厂方法实现类,用来创建具体的对象,叫做多工厂方法模式
public abstract class AudiFactory {
public abstract AudiCar createAudiCar();
}
public class AudiFactoryQ3 extends AudiFactory {
@Override
public AudiCar createAudiCar() {
return new AudiCarQ3();
}
}
public class AudiFactoryQ5 extends AudiFactory {
@Override
public AudiCar createAudiCar() {
return new AudiCarQ5();
}
}
(2) 上面的方式都没有通用性,可以利用反射动态创建不同的对象实例
public abstract class AudiFactory {
public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);
}
public class AudiFactoryImpl extends AudiFactory {
@Override
public <T extends AudiCar> T createAudiCar(Class<T> clz) {
AudiCar car = null;
try {
car = (AudiCar) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {}
return (T) car;
}
}
(3) 一般使用静态方法即可,比较常见
public class AudiFactory {
public static <T extends AudiCar> T createAudiCar(Class<T> clz) {
AudiCar car = null;
try {
car = (AudiCar) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {}
return (T) car;
}
}