例子女娲造人
1.人类接口
public interface IPeople {
public void talk();
}
2.三种人实现这个接口
public class BlackPeople implements IPeople{
@Override
public void talk() {
System.out.println(".......#$%$#%@#%&^&");
}
}
public class WritePeople implements IPeople{
@Override
public void talk() {
System.out.println(".......英语");
}
}
public class YellowPeople implements IPeople{
@Override
public void talk() {
System.out.println(".........中国话");
}
}
3.造人的工厂
/**
* 工厂对象另一好处是延迟初始化
* 延迟初始化:一个对象初始化完毕后就不释放,等到再次调用就不用初始化了,直接从内存里获取
*/
private static Map<String,IPeople> peoples = new HashMap<String,IPeople>();
public static IPeople create(Class c){
IPeople ip = null;
try {
if(peoples.containsKey(c.getSimpleName())){
ip = peoples.get(c.getSimpleName());
}else{
ip = (IPeople)Class.forName(c.getName()).newInstance();
peoples.put(c.getSimpleName(), ip);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return ip;
}
/**
* 随机创建
* @return
*/
public static IPeople create(){
IPeople ip = null;
List<Class> list = ClassUtils.getAllClassByInterface(IPeople.class);
Random r = new Random();
int dom = r.nextInt(list.size());
ip = create(list.get(dom));
return ip;
}
4.class工具类
public static List<Class> getAllClassByInterface(Class c) {
List<Class> returnClassList = new ArrayList<Class>(); // 返回结果
// 如果不是一个接口,则不做处理
if (c.isInterface()) {
String packageName = c.getPackage().getName(); // 获得当前的包名
try {
List<Class> allClass = getClasses(packageName); // 获得当前包下以及子包下的所有类
// 判断是否是同一个接口
for (int i = 0; i < allClass.size(); i++) {
if (c.isAssignableFrom(allClass.get(i))) { // 判断是不是一个接口
if (!c.equals(allClass.get(i))) { // 本身不加进去
returnClassList.add(allClass.get(i));
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return returnClassList;
}
// 从一个包中查找出所有的类,在jar包中不能查找
private static List<Class> getClasses(String packageName) throws ClassNotFoundException, IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
String path = packageName.replace('.', '/');
Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<File>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList<Class> classes = new ArrayList<Class>();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes;
}
private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException {
List<Class> classes = new ArrayList<Class>();
if (!directory.exists()) {
return classes;
}
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
assert !file.getName().contains(".");
classes.addAll(findClasses(file, packageName + "." + file.getName()));
} else if (file.getName().endsWith(".class")) {
classes.add(
Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
}
}
return classes;
}
5.女娲
public static void main(String[] args) {
YellowPeople yp = (YellowPeople)PeopleFactory.create(YellowPeople.class);
yp.talk();
BlackPeople bp = (BlackPeople)PeopleFactory.create(BlackPeople.class);
bp.talk();
WritePeople wp = (WritePeople)PeopleFactory.create(WritePeople.class);
wp.talk();
for (int i = 0; i < 10; i++) {
IPeople ip = PeopleFactory.create();
ip.talk();
}
}