设计模式之工厂模式
女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这
个词被现代人滥用了。这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛
蓝的,水是清澈的,空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的到
都是静态的东西呀,怎么办?
别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人,
具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:
第一次烤泥人,兹兹兹兹,感觉应该熟了,往地上一扔,biu,一个白人诞生了,没烤熟!~
第二次烤泥人,兹兹兹兹兹兹兹兹~~,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,
黑人哪!
第三次烤泥人,兹兹兹~,一边烤一边看着,嘿,正正好,Perfect!优品,黄色人种!【备注:RB 人
不属此列】
/**定义接口:Human
public interface Human{
public void laugh();
public void cry();
public void talk();
}
定义白色人种
public class WhileHuman implements Human{
public void cry() {
System.out.println("我是小白人,我会哭");
}
public void laugh() {
System.out.println("我是小白人,我会哭");
}
public void talk() {
System.out.println("我是小白人,我会哭");
}
}
定义黑人
public class BlackHuman implements Human {
public void cry() {
System.out.println("我是小黑人,我会哭");
}
public void laugh() {
System.out.println("我是小黑人,我会哭");
}
public void talk() {
System.out.println("我是小黑人,我会哭");
}
}
定义黄人
public class Yellowhuman implements Human {
public void cry() {
System.out.println("我是小黄人,我会哭");
}
public void laugh() {
System.out.println("我是小黄人,我会笑");
}
public void talk() {
System.out.println("我是小黄人,我会叫");
}
}
创建工厂
在这里插入代码片public class HumanFactory {
private static Map<String,Human> map = new HashMap<String, Human>(16);
public static Human createHuman(Class c){
Human h = null;
try {
if(map.containsKey(c.getSimpleName())){
h = map.get(c.getSimpleName());
}else{
h =(Human) Class.forName(c.getName()).newInstance();
map.put(c.getSimpleName(),h);
}
}catch (IllegalAccessException e){
System.out.println("创建失败,非法的类:" + e.getMessage());
}catch (ClassNotFoundException ex){
System.out.println("创建失败,没有找到这样的类");
} catch (InstantiationException e) {
e.printStackTrace();
}
return h;
}
}
``
这个程序你跑不起来,还得有这个类
```java
public class ClassUtils {
public static List<Class> getAllClassByInterface(Class c){
List<Class> returnList = 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))){
returnList.add(allClass.get(i));
}
}
}
}catch (Exception e){
}
}
return returnList;
}
/**
* 获取一个包中所有的类
* @param packageName
* @return
*/
private static List<Class> getClasses(String packageName) throws IOException, ClassNotFoundException {
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 dir : dirs){
classes.addAll(findClasses(dir,packageName));
}
return classes;
}
private static List<Class> findClasses(File dire,String packageName) throws ClassNotFoundException {
List<Class> classes = new ArrayList<Class>();
if(!dire.exists()){
return classes;
}
File[] files = dire.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;
}
}
最后声明女娲
public class FactoryApplication {
public static void main(String[] args) {
Human human = HumanFactory.createHuman();
human.talk();
human.laugh();
human.cry();
}