美文网首页
设计模式(一)-- 简单工厂模式

设计模式(一)-- 简单工厂模式

作者: 信仰年輕 | 来源:发表于2018-11-13 17:13 被阅读0次

    源代码
    GitHub源代码

    1.本文目标

    本文目标是为了让大家认识并理解简单工厂设计模式。简单工厂模式,它其实不属于GOF23种设计模式,但是在这里也进行一个分享。

    2.基本套路

    定义:由一个工厂对象决定创建出哪一种产品类的实例。
    类型:创建型
    选择关键点:一种产品是否可根据某个参数决定它的种类。
    设计原则:遵循单一职责、违背开闭原则
    使用概率:99.99999%
    难度系数:低

    3.适用场景

    1.工厂类负责创建的对象比较少。
    2.调用者只需要知道传入工厂类的参数,然后如何创建对象并不需要关心。

    4.使用步骤

    1.创建抽象产品类 & 定义具体产品的公共接口;
    2.创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
    3.创建工厂类,通过创建方法根据传入不同参数从而创建不同具体产品类的实例;
    4.外界通过调用工厂类对象的方法,传入不同参数从而创建不同具体产品类的实例

    5.举个栗子

    我们用具体的代码去更好的理解这个设计模式

    5.1栗子说明

    • 背景:想分享,然后通过生产Java视频和Python视频的方式进行传播
    • 目的:希望使用简单工厂模式实现这2个产品的生产

    5.2使用步骤

    实现代码如下:
    步骤1.创建抽象产品类,定义具体产品的公共接口

    public abstract class BaseVideo {
        public abstract void produce();
    }
    

    步骤2.创建具体产品类(继承抽象产品类),定义生产的具体产品

    public class JavaVideo extends BaseVideo {
        @Override
        public void produce() {
            System.out.println("生产JavaVideo");
        }
    }
    
    public class PythonVideo extends BaseVideo {
        @Override
        public void produce() {
            System.out.println("生产PythonVideo");
        }
    }
    

    步骤3.创建工厂类,根据传入不同参数创建不同具体产品类的实例对象

    public class VideoFactory {
    
        /**
         * 根据Class字节码对象去得到对应的对象
         */
        public BaseVideo getVideo(Class c){
            BaseVideo video=null;
            try {
                video = (BaseVideo) Class.forName(c.getName()).newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return video;
        }
    
        /**
         * 根据type类型去得到对应的对象
         */
        public BaseVideo getVideo(String type){
            if("java".equalsIgnoreCase(type)){
                return new JavaVideo();
            }else if("python".equalsIgnoreCase(type)){
                return new PythonVideo();
            }
            return null;
        }
    }
    

    步骤4. 创建工厂类对象,外界通过调用工厂类对象的方法,传入不同参数从而创建不同具体产品类的实例

     public static void main(String[] args) {
            VideoFactory videoFactory = new VideoFactory();
    
            //创建JavaVideo,根据类的Class字节码
            BaseVideo javaVideo = videoFactory.getVideo(JavaVideo.class);
            javaVideo.produce();
    
            //创建PythonVideo,根据String字符串类型
            BaseVideo pythonVideo = videoFactory.getVideo("python");
            pythonVideo.produce();
      }
    

    6.优点

    • 只需要传入一个正确的参数,就可以获取你所需要的对象而无需知道其创建细节。

    7.缺点

    • 工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背开闭原则。

    8.总结

    本文只是对简单工厂模式进行一个分享,接下来会从创建型模式,结构型模式,行为型模式,这三大类展开一个系列分享,大家可以持续进行关注,信仰年輕的设计模式,蟹蟹啦。

    相关文章

      网友评论

          本文标题:设计模式(一)-- 简单工厂模式

          本文链接:https://www.haomeiwen.com/subject/krbkfqtx.html