【设计模式】简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)

简介: 【设计模式】简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)

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 视频

image.png

目录
相关文章
|
3天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
3天前
|
设计模式 Java 数据库连接
【企业场景】设计模式重点解析(下)
【企业场景】设计模式重点解析
6 0
|
3天前
|
设计模式 算法 Java
【企业场景】设计模式重点解析(上)
【企业场景】设计模式重点解析
9 0
|
3天前
|
设计模式 uml
【设计模式】一文搞定简单工厂模式!
【设计模式】一文搞定简单工厂模式!
8 2
|
3天前
|
设计模式 前端开发 API
写出易维护的代码|React开发的设计模式及原则
本文对React社区里出现过的一些设计模式进行了介绍,并讲解了他们遵循的设计原则。
|
3天前
|
设计模式 存储 前端开发
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
26 4
|
3天前
|
设计模式 消息中间件 存储
18个并发场景的设计模式详解,有没有你的盲区
这些模式在多线程并发编程中非常有用`。在分布式应用中,并发场景无处不在,理解和掌握这些并发模式的编码技巧,有助于我们在开发中解决很多问题,这要把这些与23种设计模式混淆了,虽然像单例模式是同一个,但这个是考虑并发场景下的应用。内容比较多,V哥建议可以收藏起来,即用好查。拜拜了您誒,晚安。
18个并发场景的设计模式详解,有没有你的盲区
|
3天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
3天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
3天前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~简单工厂模式
[设计模式 Go实现] 创建型~简单工厂模式