首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式-工厂方法模式(factory method pattern)

2013-07-11 
设计模式----工厂方法模式(factory method pattern)给定一个工厂类,用这个工厂类造出一堆对象来,这些对象

设计模式----工厂方法模式(factory method pattern)
给定一个工厂类,用这个工厂类造出一堆对象来,这些对象对应的类实现了同一个接口

Human.java为接口类,具体代码如下:

 package com.designPattern.factoryMethod;public interface Human {public void laugh();public void cry();public void talk();}


Human接口的具体实现类为:

BlackHuman.java代码如下:
package com.designPattern.factoryMethod;public class BlackHuman  implements Human{@Overridepublic void laugh() {System.out.println("黑色人种会笑!");}@Overridepublic void cry() {System.out.println("黑色人种会哭!");}@Overridepublic void talk() {System.out.println("黑色人种会交谈!");}}


WhiteHuman.java代码如下:
 package com.designPattern.factoryMethod;public class WhiteHuman implements Human{@Overridepublic void laugh() {System.out.println("白色人种会笑!");}@Overridepublic void cry() {System.out.println("白色人种会哭!");}@Overridepublic void talk() {System.out.println("白色人种会交谈!");}}


YellowHuman.java代码如下:
package com.designPattern.factoryMethod;public class YellowHuman implements Human{@Overridepublic void laugh() {System.out.println("黄色人种会笑!");}@Overridepublic void cry() {System.out.println("黄色人种会哭!");}@Overridepublic void talk() {System.out.println("黄色人种会交谈!");}}


工厂类HumanFactory.java代码如下:
package com.designPattern.factoryMethod;import java.util.List;import java.util.Random;public class HumanFactory {public static Human createHuman(Class c){Human human = null;try{human = (Human)Class.forName(c.getName()).newInstance();}catch(Exception e){e.printStackTrace();}return human;}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;}}


工厂类中用到的工具类ClassUtils.java代码如下:
package com.designPattern.factoryMethod;import java.io.File;import java.io.IOException;import java.net.URL;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;public class ClassUtils {@SuppressWarnings("rawtypes")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++){//isAssignableFrom用来判断一个类和另一个类是否相同或是另一个类的超类或接口//这里的两个if语句是找出Human接口的所有实现类if(c.isAssignableFrom(allClass.get(i))){if(!c.equals(allClass.get(i))){returnClassList.add(allClass.get(i));}}}}catch(Exception e){e.printStackTrace();}}return returnClassList;}private static List<Class> getClasses(String packageName) throws ClassNotFoundException,IOException {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();String path = packageName.replace('.', '/');//注意:这里的path中不能有空格,否则会被解析为%20,将会出现错误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;}}


工厂类的调用类NvWa.java代码如下:
 package com.designPattern.factoryMethod;public class NvWa {public static void main(String[] args) throws Exception{System.out.println("----------------造出的第一批人:白人---------------------");Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);whiteHuman.laugh();whiteHuman.cry();whiteHuman.talk();System.out.println("----------------造出的第二批人:黑人---------------------");Human blackHuman = HumanFactory.createHuman(BlackHuman.class);blackHuman.laugh();blackHuman.cry();blackHuman.talk();System.out.println("----------------造出的第三批人:黄色人种---------------------");Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);yellowHuman.laugh();yellowHuman.cry();yellowHuman.talk();for(int i=0;i<10;i++){System.out.println("工厂造人");Human human = HumanFactory.createHuman();human.cry();human.laugh();human.talk();}}}


运行结果如下:

----------------造出的第一批人:白人---------------------白色人种会笑!白色人种会哭!白色人种会交谈!----------------造出的第二批人:黑人---------------------黑色人种会笑!黑色人种会哭!黑色人种会交谈!----------------造出的第三批人:黄色人种---------------------黄色人种会笑!黄色人种会哭!黄色人种会交谈!工厂造人黄色人种会哭!黄色人种会笑!黄色人种会交谈!工厂造人黄色人种会哭!黄色人种会笑!黄色人种会交谈!工厂造人白色人种会哭!白色人种会笑!白色人种会交谈!工厂造人黄色人种会哭!黄色人种会笑!黄色人种会交谈!工厂造人白色人种会哭!白色人种会笑!白色人种会交谈!工厂造人黄色人种会哭!黄色人种会笑!黄色人种会交谈!工厂造人黄色人种会哭!黄色人种会笑!黄色人种会交谈!工厂造人黑色人种会哭!黑色人种会笑!黑色人种会交谈!工厂造人黄色人种会哭!黄色人种会笑!黄色人种会交谈!工厂造人黄色人种会哭!黄色人种会笑!黄色人种会交谈!



热点排行