工厂方法模式
简单工厂模式的优势:让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。工厂模式也有一个小小的缺陷:当产品修改时,工厂类也要做相应的修改。
老大给我举得例子是女娲造人的例子,造人需要泥人,八卦炉,八卦炉就属于造人的工厂
造人首先要创建一个人类这个类。特征是颜色,会说话
public interface IHuMan {
public abstract String Color();
public abstract String Talk();
}
然后创建三个类,分别取名黑种人,白种人,和黄种人,这三个类都继承人类这个接口*/
刚开始女娲娘娘试着造人,第一次没掌握好火候,于是黑人就出来了····
public class BlackHuman implements IHuMan {
@Override
public String Color() {
System.out.println(“黑人出来了,颜色是黑色”);
return null;
}
@Override
public String Talk() {
System.out.println(“黑人说话我听不懂”);
return null;
}
}
然后女娲娘娘第二次造人,这次怕再把火候掌握不好,就早点开炉,结果这次时间太早了,白人诞生了····
public class WhiteHuman implements IHuMan {
@Override
public String Color() {
System.out.println(“白种人诞生了,皮肤颜色是白色”);
return null;
}
@Override
public String Talk() {
System.out.println("白人一出来,说了一句“my God”");
return null;
}
}
女娲娘娘总结了前两次的经验,这次是边观察火候,边造人,于是黄种人诞生了
public class YellowHuman implements IHuMan {
@Override
public String Color() {
System.out.println("黄人诞生了,皮肤颜色是黄皮肤");
return null;
}
@Override
public String Talk() {
System.out.println("黄人说的话能听得懂");
return null;
}
}
于是女娲娘娘就这样不停的造人,日复一日,夜复一夜。但是效率太慢了,于是女娲娘娘想出了一个好办法,问西王母接了她的八卦炉,相处什么人直接扔八卦炉里,什么都不管了,效率高多了
public abstract class AbstractHumanFactory {
public abstract T createHuman(Class c);
}
/*其实工厂方法模式可以和其他多种模式一起配合使用,比如这里就和单列模式一起使用的。
public class HumanFactory implements IHuManFactory {
private static HumanFactory humanFactory = null;
private HumanFactory(){
};
public static HumanFactory getInstance(){
if(humanFactory == null){
humanFactory = new HumanFactory();
}
return humanFactory;
}
@Override
public <T extends IHuMan> T CreateHuman(Class<T> c) {
T human = null;
try {
human = (T) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return human;
}
}
/*这样就方便多了,想造什么人就可以直接调用
public class Client {
public static void main(String[] args) {
BlackHuman bh = HumanFactory.getInstance().CreateHuman(BlackHuman.class);
bh.getColor();
WhiteHuman wh = HumanFactory.getInstance().CreateHuman(WhiteHuman.class);
wh.getColor();
}
}