设计模式----工厂方法模式(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{

@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();
}
}

}



运行结果如下:


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值