4、工厂类
简单工厂模式的缺点 : 如果要增加新的课程如 C 课程 , 就需要修改 getVedio 方法 , 在该方法中添加新的分支 , 明显该操作违反了开闭原则 , 对扩展开方 , 对修改关闭 , 只要修改就会带来风险 ;
使用传入 Class 参数的方法 , 可以解决上述问题 , 如果要扩展 , 只需要传入不同的 Class 类即可 , 不需要修改工厂方法 ;
代码示例 :
package simplefactory; /** * 简单工厂模式的缺点 : * 如果要增加新的课程如 C 课程 , 就需要修改 getVedio 方法 * 在该方法中添加新的分支 * 明显该操作违反了开闭原则 , 对扩展开方 , 对修改关闭 * 只要修改就会带来风险 * * 使用传入 Class 参数的方法 , 可以解决上述问题 , 如果要扩展 * 只需要传入不同的 Class 类即可 */ public class VedioFactory { /** * 根据传入的参数 , 创建不同的 Vedio 子类实例对象 * 该方法不符合开闭原则 * 如果增加新的 Vedio 子类 , 需要修改本方法 , 增加新的分支 * @param type * @return */ public Vedio getVedio(String type) { Vedio vedio = null; if ("Java".equals(type)) { vedio = new JavaVedio(); } else if ("Python".equals(type)) { vedio = new PythonVedio(); } return vedio; } /** * 根据传入的参数 , 创建不同的 Vedio 子类实例对象 * 该方法符合开闭原则 * 如果增加新的 Vedio 子类 , 不需要修改本方法 * @param clazz * @return */ public Vedio getVedio(Class<?> clazz) { Vedio vedio = null; // 通过反射创建对象 try { vedio = (Vedio) Class.forName(clazz.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return vedio; } }
5、测试类
package simplefactory; public class Main { public static void main(String[] args) { // 如果直接创建 JavaVedio // 那么本类需要依赖 JavaVedio , 即导入 JavaVedio 依赖 Vedio javaVedio = new JavaVedio(); javaVedio.produce(); // 如果直接创建 PythonVedio // 那么本类需要依赖 PythonVedio , 即导入 PythonVedio 依赖 Vedio pythonVedio = new PythonVedio(); pythonVedio.produce(); System.out.println(); // 使用工厂类 , 可以避免直接依赖被创建的类 // 不管创建多少种类的实例对象 , 只需要依赖一个工厂类即可 Vedio javaVedio2 = new VedioFactory().getVedio("Java"); javaVedio2.produce(); Vedio pythonVedio2 = new VedioFactory().getVedio("Python"); pythonVedio2.produce(); } }
执行结果 :
录制 Java 视频 录制 Python 视频 录制 Java 视频 录制 Python 视频