1、实用场景
- 工厂类负责创立的对象比拟少
应用层只晓得传入工厂类的参数 对于如何创建对象 创立谁的对象并不关怀
2、长处
只需传入正确的参数 即可由工厂给咱们创立对应的实例 无需理解创立的细节
3、毛病
减少新产品的时候 须要批改代码 违反了开闭准则
4、Coding演示
4.1 版本一
UML类图预览:
1.抽象类video
public abstract class Video { /** 创立学习视频 */ public abstract void produce();}
2.JavaVideo继承抽象类 并实现形象办法
public class JavaVideo extends Video{ @Override public void produce() { System.out.println("录制java学习视频中"); }}
3.PythonVideo继承抽象类 并实现形象办法
public class PythonVideo extends Video{ @Override public void produce() { System.out.println("录制python学习视频"); }}
4.简略工厂类
public class VideoFactory { public Video getVideo(String videoType){ if("java".equalsIgnoreCase(videoType)) return new JavaVideo(); else if("python".equalsIgnoreCase(videoType)) return new PythonVideo(); return null; }}
5.测试类
public class Test { public static void main(String[] args) { VideoFactory videoFactory = new VideoFactory(); Video java = videoFactory.getVideo("java"); java.produce(); Video python = videoFactory.getVideo("python"); python.produce(); }}
输入后果:
上述的代码构造中咱们应用一个Factory类,用来帮忙咱们生产对应的实例,咱们须要传入正确的参数,Factory能够帮忙咱们创立对应的实例。这就如同咱们去咖啡厅喝咖啡,咱们只需对watier说:"我要一杯拿铁",服务员就会主动上拿铁,而不须要咱们关怀制作拿铁的步骤。4.2 版本2
咱们发现在代码中把对应的参数写死并不合乎代码的标准,也不不便保护。所以咱们思考应用反射对代码进行一下重构。
public class VideoFactory { public Video getVideo(Class c){ Video video = null; try { // Class.forName加载指定的类 video = (Video)Class.forName((c.getName())).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return video; }}
咱们应用反射,依据传入的Class运行时类主动创立实例,不仅实现了同样的性能,也晋升了代码的品质。
5、扩大
简略工厂模式在源码中的体现
5.1 Calendar.class
类图:
下面的这种应用办法 咱们也常常在开发中应用到
5.2 在jdbc中应用
回顾一下获取jdbc连贯的三步?
public class MySqlConnectionTest { public static void getConnection() { Connection conn = null; try { // 注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 数据库的地址 String url = "jdbc:mysql://localhost:3306/briup"; // 获取连贯数据库的Connection对象 conn = DriverManager.getConnection(url, "root","root"); System.out.println("数据库连贯胜利!" + conn); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { getConnection(); }
上述代码中咱们应用类名通过反射将数据库的驱动加载进来,而后通过DriverManager获取对应的连贯。对mysql,orcal都是这样的步骤,因而咱们来探索一下DriverManager获取连贯的办法
上述代码中通过遍历 registeredDrivers 获取对应的注册驱动。那么他是如何获取的呢?
也就是说一旦这个驱动就像驱动治理DriverManager注册了咱们的驱动。而咱们是通过反射指定类名加载mysql的驱动,因而也就会获取mysql对应的链接