工厂模式

来源:互联网 发布:myeclipse导入java项目 编辑:程序博客网 时间:2024/06/05 04:01

人物:充气娃娃,屌丝

故事:屌丝天天对着就那两个娃娃都厌烦了,所以决定自己造充气娃娃,而且要大规模的自动化造娃娃

要点:通过接口定义标准,通过反射来实例化具体对象。

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 {@Overridepublic void MakeLove() {System.out.println("亚洲充气娃娃,做爱,魂牵梦绕");}@Overridepublic void CanGroan() {System.out.println("亚洲充气娃娃,呻吟,千娇百媚");}}

3.定义符合标准的欧洲充气娃娃

package org.senssic.design.factory;public class EuropeBianca implements Bianca {@Overridepublic void MakeLove() {System.out.println("欧洲充气娃娃,做爱,粗犷豪迈");}@Overridepublic 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();// 屌丝让机器自己造娃娃只要是充气娃娃他都喜欢都happyfor (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
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚

0 0
原创粉丝点击