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

举报
韩曙亮 发表于 2022/01/11 00:31:39 2022/01/11
【摘要】 文章目录 一、简单工厂模式简介二、简单工厂模式适用场景三、简单工厂模式优缺点四、简单工厂模式代码示例1、抽象类2、子类对象 13、子类对象 24、工厂类5、测试类 一、简...





一、简单工厂模式简介



简单工厂模式 : 由 一个 工厂对象 决定 创建出 哪一种 产品类 实例 ;

简单工厂模式类型 : 创建型 ;





二、简单工厂模式适用场景



简单工厂模式适用场景 :

  • 创建对象少 : 工厂类 负责 创建的对象 比较少 ;

  • 不关心创建过程 : 客户端 只知道 传入 工厂类 的参数 , 对于 如何创建对象 不关心 ;





三、简单工厂模式优缺点



简单工厂模式优点 : 只需要传入 正确的参数 , 就可以 获取需要的对象 , 无需知道创建细节 ;
工厂类中有必要的 判断逻辑 , 可以决定 根据当前的参数 创建对应的产品实例 , 客户端可以免除直接创建产品对象的责任 ;
通过该模式 , 实现了对 创建实例使用实例责任分割 ;
提供专门的 工厂类 用于创建对象 , 客户端 无需知道所创建的产品类的类名 , 只需要知道对应产品类的参数即可创建对象实例 ;


简单工厂模式缺点 : 工厂类 职责 过重 , 如果要增加新的产品 , 需要 修改工厂类的判断逻辑 , 违背 " 开闭原则 " ;
7 7 7 大设计原则 , 不能全部遵守 , 也不能不遵守 , 注意平衡 功能 和 系统复杂度 , 找到最合适的一个点 ;





四、简单工厂模式代码示例




1、抽象类


package simplefactory;

/**
 * 视频抽象
 */
public abstract class Vedio {
    /**
     * 生产视频
     */
    public abstract void produce();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2、子类对象 1


package simplefactory;

public class JavaVedio extends Vedio {
    @Override
    public void produce() {
        System.out.println("录制 Java 视频");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3、子类对象 2


package simplefactory;

public class PythonVedio extends Vedio {
    @Override
    public void produce() {
        System.out.println("录制 Python 视频");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

执行结果 :

录制 Java 视频
录制 Python 视频

录制 Java 视频
录制 Python 视频

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/119847210

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。