一句话定义:
定义一个用于创建对象的接口,让其子类决定实例化哪个工厂类,将创建延迟到子类进行。
使用场景:
1. 复杂的对象的创建
2. 明确知道不同条件创建不同的对象
实现要点:
1. 子类实现工厂接口,返回的也是一个抽象的产品
2. 创建过程在子类执行
情景假设:
工厂模式的常见例子。汽车工程,能够生产奥迪和宝马两种汽车。
实现步骤:
1. 创建汽车抽象类
public abstract class Car {
public abstract String name();
}
2. 创建包装实体类
public class BaomaCar extends Car {
@Override
public String name() {
return "宝马 82";
}
}
public class AodiCar extends Car {
@Override
public String name() {
return "奥迪 23";
}
}
3. 创建汽车工厂
public class CarFactory {
/**
* 创建方法
* @param <T> 汽车泛型
*/
public <T extends Car> T createCar(Class<T> clz){
T car = null;
try {
car = (T) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return car;
}
}
4. 使用工厂进行创建
// 使用工厂进行创建
AodiCar car = new CarFactory().createCar(AodiCar.class)
BaomaCar car1 = new CarFactory().createCar(BaomaCar.class)
Log.i("info", "onCreate: ==++" + car.name())
Log.i("info", "onCreate: ==++" + car1.name())
补充内容:反射
上面创建Car实体的时候用到了反射,也可以用常规方式分别创建接口进行创建。如下:
/**
* 创建奥迪汽车接口
*/
public AodiCar createAodiCar(){
return new AodiCar();
}
反射机制的实现原理不做分析,简单用法:
1. 反射可以获得所有类的方法、属性
2. 通过 实例.getClass() 获得Class对象
3. 通过Class.forName("name") 获得Class对象
4. Class中getName() 获得类名字符串
5. Class中newInstance()调用类的默认构造方法创建实例