1.女娲创造人:白人,黑人,黄人
2.类图:
3.程序
public interface Human {
void laugh();
void cry();
void talk();
}
public class BlackHuman implements Human {
@Override
public void laugh() {
System.out.println("Black laugh");
}
@Override
public void cry() {
System.out.println("Black cry");
}
@Override
public void talk() {
System.out.println("Black talk");
}
}
public class WhiteHuman implements Human {
@Override
public void laugh() {
System.out.println("White laugh");
}
@Override
public void cry() {
System.out.println("White cry");
}
@Override
public void talk() {
System.out.println("White talk");
}
}
public class YellowHuman implements Human {
@Override
public void laugh() {
System.out.println("yellow laugh");
}
@Override
public void cry() {
System.out.println("yellow cry");
}
@Override
public void talk() {
System.out.println("yellow talk");
}
}
public class HumanFactory {
public static Human createHuman(Class c){
Human human = null;
try{
human = (Human)Class.forName(c.getName()).newInstance();
} catch (IllegalAccessException e) {
System.out.println("指定颜色");
} catch (InstantiationException e) {
System.out.println("定义人类有问题");
} catch (ClassNotFoundException e) {
System.out.println("找不到");
}
return human;
}
}
public class NvWa {
public static void main(String[] args) {
System.out.println("1");
Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
whiteHuman.cry();
whiteHuman.laugh();
whiteHuman.talk();
System.out.println("2");
Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
blackHuman.cry();
blackHuman.laugh();
blackHuman.talk();
System.out.println("3");
Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
yellowHuman.cry();
yellowHuman.laugh();
yellowHuman.talk();
}
}
随机创建黑白黄人
程序
import java.util.List;
import java.util.Random;
public class HumanFactory {
//2.随机创建黑白黄人
public static Human createHuman(){
Human human = null;
List<Class> concreteHumanList = ClassUtils.getAllClassByInterface(Human.class);
Random random = new Random();
int rand = random.nextInt(concreteHumanList.size());
human = createHuman(concreteHumanList.get(rand));
return human;
}
}
public class NvWa {
public static void main(String[] args) {
//2
for (int i = 0; i < 1000000000; i++) {
System.out.println("随机产生");
Human human = HumanFactory.createHuman();
human.cry();
human.laugh();
human.talk();
}
}
}
完整类图
工厂方法模式还有一个非常重要的应用 ,
就是延迟始化 (Lazy initialization):一个对象初始化完毕后就不释放 ,等到再次用到得就不用再次初始化了 ,直接从内存过中拿到就可以了 ,
package shejimoshi.factoryMethodPattern;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
public class HumanFactory {
//延迟始化
private static HashMap<String, Human> humans = new HashMap<String, Human>();
public static Human createHuman1(Class c){
Human human = null;
try{
if(humans.containsKey(c.getSimpleName())){
human = humans.get(c.getSimpleName());
}else {
human = (Human)Class.forName(c.getName()).newInstance();
humans.put(c.getSimpleName(),human);
}
} catch (IllegalAccessException e) {
System.out.println("指定颜色");
} catch (InstantiationException e) {
System.out.println("人类定义错误");
} catch (ClassNotFoundException e) {
System.out.println("zhaobudao");
}
return human;
}
}
很简单 ,就加上了黄色那部分的代码 ,这个在类初始化很消耗资源的情况比较实用 ,比如你要连接硬件 ,或 者 是 为 了 初 始 化 一 个 类 需 要 准 备 比 较 多 条 件(参数 ),通 过 这 种 方 式 可 以 很 好 的 减 少 项 目 的 复 杂 程 度 。