工厂模式
来源:互联网 发布: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
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚
- 工厂模式 -- 工厂方法
- 工厂模式 -- 抽象工厂
- 工厂模式-简单工厂
- 工厂模式-工厂方法
- 工厂模式:静态工厂
- 工厂模式-简单工厂
- 工厂模式-抽象工厂
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-静态工厂
- 工厂模式-抽象工厂
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- epoll的实现原理
- windows核心编程 学习笔记1
- VC的read函数读取文件,读取的数据比实际文件大小要少的问题
- LDO电源管理器件
- idea+mave+tomcat运行web项目
- 工厂模式
- error: cast from ‘void*’ to ‘int’ loses precision
- C++与flash通信安全沙箱问题
- Python中setuptools的简介
- dm8168的DSP和ARM添加库与调用
- android -- FileObserver 类用法及限制
- [Android]Android SystemUI的问题
- javascript模块化编程及AMD规范
- Pro Android学习笔记(九九):BroadcastReceiver(3):长时间运行Receiver的问题