工厂模式

人物:充气娃娃,屌丝

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

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

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
亚洲充气娃娃,做爱,魂牵梦绕
亚洲充气娃娃,呻吟,千娇百媚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值