工厂方法模式使用的频率非常高,在我们日常开发中总能见到它的身影。
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
其通用类图如下图所示:
实例讲解工厂方法模式
女娲造人类图
女娲造人代码
public class NvWa {
public static void main(String arg) {
//声明阴阳八卦炉
AbsHumanFactory humanFactory = new HumanFactory();
//创造一个黑人
humanFactory.createHuman(BlackHuman.class);
}
}
public interface Human {
//皮肤颜色
public void getColor();
//语言
public void talk();
}
public class BlackHuman implement Human {
@Override
public void getColor() {
//黑色的皮肤
System.out.println("黑色的皮肤");
}
@Override
public void talk() {
System.out.println("黑人语言");
}
}
public class WhiteHuman extends Human {
@Override
public void getColor() {
System.out.println("白色的皮肤");
}
@Override
public void talk() {
System.out.println("白人的语言");
}
}
public class YellowHuman extends Human {
@Override
public void getColor() {
System.out.println("黄色的皮肤");
}
@Override
public void talk() {
System.out.println("黄种人的语言");
}
}
public abstract class AbsHumanFactory {
public <T extends Human> T createHuman(Class<T> c);
}
public class HumanFactory extends AbsHumanFactory {
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 human;
}
}
创造超人实例代码
public class Client {
public static void main(String[] arg) {
//生产一个超人
ISuperMan superMan = SuperManFactory.createSuperMan("adult");
//展示下超人的技能
superMan.specialTalent();
}
}
public class SuperManFactory {
public static ISuperMan createSuperMan(String type) {
if ("adult".e(type)) {
return new AdultSuperMan();
} else if ("child".e(type)) {
return new ChildSuperMan();
} else {
return null;
}
}
}
public interface ISuperMan {
void specialTalent();
}
public class AdultSuperMan implement ISuperMan {
@Override
public void specialTalent() {
//成人超人的能力
System.out.println("力大无穷");
}
}
public class ChildSuperMan implement ISuperMan {
@Override
public void specialTalent() {
//未成年超人的能力
System.out.println("刀枪不入,移动迅速");
}
}