思路
- 首先定义一个实例的接口,实现该接口,得到多种实例(其实就是各种产品)
创建一个工厂,工厂使用某种方式创建实例并返回该实例,外界调用者不需要知道具体实现方式;实例的创建方式一定要很容易的加载到工厂中,这样有利于修改。
在本文中使用反射机制创建实例,通过读取hash映射表将实例的路径名传递给反射参数,工厂用反射将创建的实例返回给调用者。
1.定义person的接口
public interface Person {
public String getName();
}
2.实现person的3个实例
public class Hero_ADC implements Person{
private String name=null;
@Override
public String getName() {
return "我是ADC寒冰!";
}
}
public class Hero_ap implements Person{
@Override
public String getName() {
return "我是ap中单妖姬!";
}
}
public class Hero_shangdan implements Person{
@Override
public String getName() {
return "我是上单剑姬!";
}
}
3.定义hash映射表
这里使用了java中的properties文件,在工程路径下放了一个heros.properties文件
adc=heros.Hero_ADC
ap=heros.Hero_ap
shangdan=heros.Hero_shangdan
4.利用工厂创建实例并返回
这里读取路径使用绝对路径,只是为了演示思路,实际应用中最好不要这样做(代码要在各种平台上运行),考虑别的的方式,比如数据库。
public class Factory {
public static Person getHero(String position) {
/**
* 读取heros表里的数据,获取反射的路径
*/
Properties prop=new Properties();
try {
prop.load(new FileInputStream("HeroTable/heros.properties"));
} catch (FileNotFoundException e1) {
} catch (IOException e1) {
e1.printStackTrace();
}
/**
* 通过反射创建实力Person
*/
try {
return (Person)Class.forName(prop.
getProperty(position)).newInstance();
}catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
5.进行一下测试
public class DemoTest {
public static void main(String[] args) {
System.out.println(Factory.getHero("shangdan")
.getName());
}
}
控制台输出:我是上单剑姬!
简单工厂模式的思路就是这样,利用工厂来产生实例,在工厂中很容易添加或删除实例的创建方法,从而使得实例可以有一系列,增加了程序的可维护性和灵活性。复杂的工厂模式是在此基础上进行更高的抽象,就不在此列举了。