给定一个工厂类,用这个工厂类造出一堆对象来,这些对象对应的类实现了同一个接口
Human.java为接口类,具体代码如下:
Human接口的具体实现类为:
BlackHuman.java代码如下:
WhiteHuman.java代码如下:
YellowHuman.java代码如下:
工厂类HumanFactory.java代码如下:
工厂类中用到的工具类ClassUtils.java代码如下:
工厂类的调用类NvWa.java代码如下:
运行结果如下:
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{
@Override
public void laugh() {
System.out.println("黑色人种会笑!");
}
@Override
public void cry() {
System.out.println("黑色人种会哭!");
}
@Override
public void talk() {
System.out.println("黑色人种会交谈!");
}
}
WhiteHuman.java代码如下:
package com.designPattern.factoryMethod;
public class WhiteHuman implements Human{
@Override
public void laugh() {
System.out.println("白色人种会笑!");
}
@Override
public void cry() {
System.out.println("白色人种会哭!");
}
@Override
public void talk() {
System.out.println("白色人种会交谈!");
}
}
YellowHuman.java代码如下:
package com.designPattern.factoryMethod;
public class YellowHuman implements Human{
@Override
public void laugh() {
System.out.println("黄色人种会笑!");
}
@Override
public void cry() {
System.out.println("黄色人种会哭!");
}
@Override
public 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();
}
}
}
运行结果如下:
----------------造出的第一批人:白人---------------------
白色人种会笑!
白色人种会哭!
白色人种会交谈!
----------------造出的第二批人:黑人---------------------
黑色人种会笑!
黑色人种会哭!
黑色人种会交谈!
----------------造出的第三批人:黄色人种---------------------
黄色人种会笑!
黄色人种会哭!
黄色人种会交谈!
工厂造人
黄色人种会哭!
黄色人种会笑!
黄色人种会交谈!
工厂造人
黄色人种会哭!
黄色人种会笑!
黄色人种会交谈!
工厂造人
白色人种会哭!
白色人种会笑!
白色人种会交谈!
工厂造人
黄色人种会哭!
黄色人种会笑!
黄色人种会交谈!
工厂造人
白色人种会哭!
白色人种会笑!
白色人种会交谈!
工厂造人
黄色人种会哭!
黄色人种会笑!
黄色人种会交谈!
工厂造人
黄色人种会哭!
黄色人种会笑!
黄色人种会交谈!
工厂造人
黑色人种会哭!
黑色人种会笑!
黑色人种会交谈!
工厂造人
黄色人种会哭!
黄色人种会笑!
黄色人种会交谈!
工厂造人
黄色人种会哭!
黄色人种会笑!
黄色人种会交谈!