工厂方法模式
一、nuwa造人的故事-通过工厂模式造人
层次越高,一般来说越抽象。
// 定义Human的接口
public interface Human {
// 肤色
public void getColor();
// 交流
public void talk();
}
// 定义一个抽象的Human工厂
// 这个工厂有抽象方法createHuman。入参Class<T>类型,入参是实现了Human接口类的Class对象
public abstract class AbstractHumanFactory {
public abstract <T extends Human> T createHuman(Class<T> c);
}
// Human接口的具体实现
public class BlackHuman implements Human {
@Override
public void getColor() {
System.out.println("黑人是黑色皮肤");
}
@Override
public void talk() {
System.out.println("黑人说的话...");
}
}
// 创建HumanFactory 实现抽象类里的方法
public class HumanFactory extends AbstractHumanFactory {
public <T extends Human> T createHuman(Class<T> c){
Human human = null;
try{
human = (T) Class.forName(c.getName()).newInstance();
}catch (Exception e){
System.out.println("出现错误了");
}
return (T) human;
}
}
// 通过传入不同的类对象造人
public class Nuwa {
public static void main(String[] args) {
AbstractHumanFactory humanFactory = new HumanFactory();
BlackHuman blackHuman = humanFactory.createHuman(BlackHuman.class);
blackHuman.getColor();
blackHuman.talk();
// 其他肤色人种同上,需要创建不同Human的实现
}
}
工厂方法模式的定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法模式的优点:
1、封装性,代码结构清晰。不需要关注创建过程,只需要知道创建产品的类名。
2、扩展性,如果新增了产品,只需要修改具体工厂类或者新建一个工厂类
3、屏蔽产品类 。产品类的实现如何变化,调用者都不需要关心,只需要关心产品的接口。
二、工厂模式的扩展
1、简单工厂模式
// 待补充
2、升级为多个工厂类
3、替代单例模式
4、延迟初始化