前言
1.工厂模式概念
实例化对象,用工厂方法代替new操作(重点)
工厂模式包括工厂方法模式和抽象工厂模式
抽象工厂模式是工厂方法模式的扩展2.什么情况下适合工厂模式
有一组类似的对象需要创建
在编码时不能预见需要创建哪种类的实例
系统需要考虑扩展性,不应依赖于产品类实例如果被创建、组合和表达的细节
女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这
个词被现代人滥用了。这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛
蓝的,水是清澈的,空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的到
都是静态的东西呀,怎么办?
别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人,
具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:
第一次烤泥人,兹兹兹兹~~,感觉应该熟了,往地上一扔,biu~,一个白人诞生了,没烤熟!
第二次烤泥人,兹兹兹兹兹兹兹兹~~,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,
黑人哪!
第三次烤泥人,兹~兹~兹~,一边烤一边看着,嘿,正正好,Perfect!优品,黄色人类!
这个过程还是比较有意思的,先看看类图:
根据类图可以知道需要准备的类:
1.人类接口和对应实现
package factory1;/*** 定义一个人类接口* 首先定义什么是人类** @author 1*/
public interface Human {/*** 人是愉快的,会笑的,本来是想用smile表示,想了一下laugh更合适,好长时间没有大笑了;*/public void laugh();/*** 人类还会哭,代表痛苦*/public void cry();/*** 人类会说话*/public void talk();
}
package factory1;/*** 黄种人** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:15*/
public class YellowHuman implements Human {@Overridepublic void laugh() {System.out.println("黄色人类会大笑,幸福呀!");}@Overridepublic void cry() {System.out.println("黄色人类会哭");}@Overridepublic void talk() {System.out.println("黄色人类会说话,一般说的都是双字节");}
}
package factory1;/*** 白种人** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:16*/
public class WhiteHuman implements Human {@Overridepublic void laugh() {System.out.println("白色人类会大笑,侵略的笑声");}@Overridepublic void cry() {System.out.println("白色人类会哭");}@Overridepublic void talk() {System.out.println("白色人类会说话,一般都是但是单字节!");}
}
package factory1;/*** 黑人** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:17*/
public class BlackHuman implements Human {@Overridepublic void laugh() {System.out.println("黑人会笑");}@Overridepublic void cry() {System.out.println("黑人会哭");}@Overridepublic void talk() {System.out.println("黑人可以说话,一般人听不懂");}
}
2.八卦炉
package factory1;import java.util.List;
import java.util.Random;/*** 造人工厂* 女娲造人的故事:** @author 1* @version 1.0* @description: 很久很久以前,盘古开辟了天地,用身躯造出日月星辰、山川草木,天地一片繁华* 一天,女娲下界走了一遭,哎!太寂寞,太孤独了,没个会笑的、会哭的、会说话的东东* 那怎么办呢?不用愁,女娲,神仙呀,造出来呀,然后捏泥巴,放八卦炉(后来这个成了太白金星的宝* 贝)中烤,于是就有了人:* 我们把这个生产人的过程用Java程序表现出来:* @date 2023/8/15 17:19*/
public class HumanFactory {/*** 定义一个八卦炉子** @param c* @return*/public static Human createHuman(Class c) {//定义一个类型的人类Human human = null;try {//生产一个人类human = (Human) Class.forName(c.getName()).newInstance();} catch (InstantiationException e) {System.out.println("必须指定人类颜色");} catch (IllegalAccessException e) {System.out.println("定义的人类错误");} catch (ClassNotFoundException e) {System.out.println("定义的人类找不到");}return human;}/*** 女娲生气了,把一团泥巴塞到八卦炉,哎产生啥人类就啥人类** @return*/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;}
}
批量工具类:主要实现根据接口查找实现类(属于扩展知识)
package factory1;import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;/*** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:48*/
@SuppressWarnings("all")
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;}
}
女娲类
package factory1;/*** 女娲** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:28*/
public class NvWa {public static void main(String[] args) {System.out.println("(1)女娲第一次造人,火候不足,白人----------------");Human witheHuman = HumanFactory.createHuman(WhiteHuman.class);witheHuman.talk();witheHuman.laugh();witheHuman.cry();System.out.println("(2)女娲第二次造人,火候加足点,然后又出了个次品,黑人------------------");Human blackHuman = HumanFactory.createHuman(BlackHuman.class);blackHuman.cry();blackHuman.laugh();blackHuman.talk();System.out.println("(3)女娲第三次造人,这次火候掌握的正好,黄色人类-----------------");Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);yellowHuman.cry();yellowHuman.laugh();yellowHuman.talk();System.out.println("(4)女娲让八卦炉随机造人------------------");for (int i = 0; i < 10; i++) {System.out.println("随机产生人类*******" + i);Human human = HumanFactory.createHuman();human.cry();human.laugh();human.talk();}}
}
运行结果
(1)女娲第一次造人,火候不足,白人----------------
白色人类会说话,一般都是但是单字节!
白色人类会大笑,侵略的笑声
白色人类会哭
(2)女娲第二次造人,火候加足点,然后又出了个次品,黑人------------------
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
(3)女娲第三次造人,这次火候掌握的正好,黄色人类-----------------
黄色人类会哭
黄色人类会大笑,幸福呀!
黄色人类会说话,一般说的都是双字节
(4)女娲让八卦炉随机造人------------------
随机产生人类*******0
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!
随机产生人类*******1
黄色人类会哭
黄色人类会大笑,幸福呀!
黄色人类会说话,一般说的都是双字节
随机产生人类*******2
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!
随机产生人类*******3
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******4
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******5
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******6
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!
随机产生人类*******7
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******8
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******9
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!