工厂方法模式的定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。 工厂方法使一个类的实例化延迟到其子类。
在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;Creater为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。
以下为一个例子:
女娲造人,首先采集黄土捏成人形,然后放到阴阳八卦炉中烧制,由于烧的时间不同创造出不同肤色的人种。
抽象产品类-----------------人
public abstract class AbstractHumanFactory {
public abstract <T extends Human> T createHuman(Class<T> c);
}
具体产品类-------------------白种人 黄种人 黑种人
public class WhiteHuman implements Human{
@Override
public void getColor() {
System.out.println("白种人的皮肤是白色的");
}
@Override
public void talk() {
System.out.println("白种人会说话,一般都是单字节的");
}
}
public class YellowHuman implements Human{
@Override
public void getColor() {
System.out.println("黄种人皮肤是黄色的");
}
@Override
public void talk() {
System.out.println("黄种人会说话 但一般都是双字节的");
}
}
public class BlackHuman implements Human {
@Override
public void getColor() {
System.out.println("黑众人的皮肤是黑色的");
}
@Override
public void talk() {
System.out.println("黑人会说话但一般人听不懂");
}
}
抽象工厂类--------------炉(用于烧造人)
public abstract class AbstractHumanFactory {
public abstract <T extends Human> T createHuman(Class<T> c);
}
具体工厂类---------------阴阳八卦炉
public class HumanFactory extends AbstractHumanFactory{
@Override
public <T extends Human> T createHuman(Class<T> c) {
Human human = null;
try {
human = (Human)Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T)human;
}
}
场景类-----------------------女娲
public class NvWa {
public static void main(String[] args) {
AbstractHumanFactory YinYangLu = new HumanFactory();
System.out.println("--造出的第一批是白种人--");
Human whiteHuman = YinYangLu.createHuman(WhiteHuman.class);
whiteHuman.getColor();
whiteHuman.talk();
System.out.println("--造出的第一批是黄种人--");
Human yellowHuman = YinYangLu.createHuman(YellowHuman.class);
yellowHuman.getColor();
yellowHuman.talk();
System.out.println("--造出的第一批是黑种人--");
Human blackHuman = YinYangLu.createHuman(BlackHuman.class);
blackHuman.getColor();
blackHuman.talk();
}
}