人物:充气娃娃,屌丝
故事:屌丝天天对着就那两个娃娃都厌烦了,所以决定自己造充气娃娃,而且要大规模的自动化造娃娃
要点:通过接口定义标准,通过反射来实例化具体对象。
1.定义标准的充气娃娃
package org.senssic.design.factory;
public interface Bianca {
// 可以做爱
public void MakeLove();
// 可以呻吟
public void CanGroan();
}
2.定义符合标准的亚洲充气娃娃
package org.senssic.design.factory;
public class AsianBianca implements Bianca {
@Override
public void MakeLove() {
System.out.println("亚洲充气娃娃,做爱,魂牵梦绕");
}
@Override
public void CanGroan() {
System.out.println("亚洲充气娃娃,呻吟,千娇百媚");
}
}
3.定义符合标准的欧洲充气娃娃
package org.senssic.design.factory;
public class EuropeBianca implements Bianca {
@Override
public void MakeLove() {
System.out.println("欧洲充气娃娃,做爱,粗犷豪迈");
}
@Override
public void CanGroan() {
System.out.println("欧洲充气娃娃,呻吟,地动山摇");
}
}
4.定义造充气娃娃的工厂类
package org.senssic.design.factory;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
@SuppressWarnings("rawtypes")
public class BiancaFactory {
private static HashMap<String, Bianca> biancas = new HashMap<String, Bianca>();
// 机器塞入一些硅胶啊啥的就能出来一个充气娃娃了
public static Bianca createBianca(Class c) {
Bianca bianca = null; // 定义一个类型的充气娃娃
try {
// 如果MAP中有,则直接从取出,不用初始化了,在内存中保持实例化好的对象,提高效率(空间换时间)
if (biancas.containsKey(c.getSimpleName())) {
bianca = biancas.get(c.getSimpleName());
} else {
bianca = (Bianca) Class.forName(c.getName()).newInstance();
biancas.put(c.getSimpleName(), bianca);
}
} catch (InstantiationException e) {
System.out.println("造充气娃娃失败啦,造不出来啊!");
} catch (IllegalAccessException e) {
System.out.println("充气娃娃定义错误!");
} catch (ClassNotFoundException e) {
System.out.println("指定的原材料东西没找到啊");
}
return bianca;
}
public static Bianca createBianca() {// 自己随便造,只要是充气娃娃就行
Bianca bianca = null;
List<Class> concreteBiancaList = ClassUtils
.getAllClassByInterface(Bianca.class);
Random random = new Random();
int rand = random.nextInt(concreteBiancaList.size());
bianca = createBianca(concreteBiancaList.get(rand));
return bianca;
}
}
5.反射造娃娃的工具类
package org.senssic.design.factory;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ClassUtils {
// 给一个接口,返回这个接口的所有实现类
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;
}
}
6.定义屌丝执行类
package org.senssic.design.factory;
public class DiaoSi {
public static void main(String[] args) {
// 屌丝指定造出一个亚洲人,亚洲人最贤惠好看漂亮
System.out.println("屌丝造了个亚洲的充气娃娃");
Bianca asianBianca = BiancaFactory.createBianca(AsianBianca.class);
asianBianca.MakeLove();
asianBianca.CanGroan();
// 屌丝指定造一个欧洲人体验一下异国风情
System.out.println("屌丝造出了一个欧洲充气娃娃");
Bianca europeBianca = BiancaFactory.createBianca(EuropeBianca.class);
europeBianca.MakeLove();
europeBianca.CanGroan();
// 屌丝让机器自己造娃娃只要是充气娃娃他都喜欢都happy
for (int i = 0; i < 10; i++) {
System.out.println("\n\n------------随机产生充气娃娃-----------------" + i);
Bianca bianca = BiancaFactory.createBianca();
bianca.MakeLove();
bianca.CanGroan();
}
}
}
运行结果:
屌丝造了个亚洲的充气娃娃
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚
屌丝造出了一个欧洲充气娃娃
欧洲充气娃娃,做爱,粗犷豪迈
欧洲充气娃娃,呻吟,地动山摇
------------随机产生充气娃娃-----------------0
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚
------------随机产生充气娃娃-----------------1
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚
------------随机产生充气娃娃-----------------2
欧洲充气娃娃,做爱,粗犷豪迈
欧洲充气娃娃,呻吟,地动山摇
------------随机产生充气娃娃-----------------3
欧洲充气娃娃,做爱,粗犷豪迈
欧洲充气娃娃,呻吟,地动山摇
------------随机产生充气娃娃-----------------4
欧洲充气娃娃,做爱,粗犷豪迈
欧洲充气娃娃,呻吟,地动山摇
------------随机产生充气娃娃-----------------5
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚
------------随机产生充气娃娃-----------------6
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚
------------随机产生充气娃娃-----------------7
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚
------------随机产生充气娃娃-----------------8
欧洲充气娃娃,做爱,粗犷豪迈
欧洲充气娃娃,呻吟,地动山摇
------------随机产生充气娃娃-----------------9
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚