zoukankan      html  css  js  c++  java
  • java设计模式——工厂模式

    一. 定义与类型

    定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行

    类型:创建型

    二. 使用场景

    创建对象需要大量重复的代码

    客户端(应用层)不依赖于产品类实例如何被创建,实现等细节

    一个类通过其子类来指定创建哪个类

    三. 优缺点

    优点:用户只需要关系所需产品对应的工厂,无需关心创建细节,加入新产品符合开闭原则,提高可扩展性

    缺点:类的个数容易过多,增加复杂度,增加了系统的抽象行和理解难度

    四. coding

    我们还是以上一篇的简单工厂的video为例。在原来的基础上做一定的修改,符合开闭原则。

    /**
     * @program: designModel
     * @description:
     * @author: YuKai Fan
     * @create: 2018-11-13 16:50
     **/
    public abstract class VideoFactory {
    
        public abstract Video getVideo();
    
    }

    抽象工厂类中的具体工厂对象video(这个也是抽象的,只是对于抽象工厂来说,是具体的)

    /**
     * @program: designModel
     * @description: 视频类
     * @author: YuKai Fan
     * @create: 2018-11-13 16:46
     **/
    public abstract class Video {
        public abstract void product();
    }

    具体的实体类,是继承video:

    /**
     * @program: designModel
     * @description: java视频类
     * @author: YuKai Fan
     * @create: 2018-11-13 16:47
     **/
    public class JavaVideo extends Video {
        public void product() {
            System.out.println("录制java课程视频");
        }
    }
    /**
     * @program: designModel
     * @description: Python视频类
     * @author: YuKai Fan
     * @create: 2018-11-13 16:48
     **/
    public class PythonVideo extends Video {
        public void product() {
            System.out.println("录制Python课程视频");
        }
    }

    具体的工厂类,是用来创建具体的实体对象的:

    /**
     * @program: designModel
     * @description:
     * @author: YuKai Fan
     * @create: 2018-11-21 11:05
     **/
    public class JavaVideoFactory extends VideoFactory {
        public Video getVideo() {
            return new JavaVideo();
        }
    }
    /**
     * @program: designModel
     * @description:
     * @author: YuKai Fan
     * @create: 2018-11-21 11:06
     **/
    public class PythonVideoFactory extends VideoFactory {
        public Video getVideo() {
            return new PythonVideo();
        }
    }

    客户端:

    /**
     * @program: designModel
     * @description:
     * @author: YuKai Fan
     * @create: 2018-11-13 16:48
     **/
    public class Test {
        public static void main(String[] args) {
            VideoFactory videoFactory = new JavaVideoFactory();
            Video video = videoFactory.getVideo();
            video.product();
        }
    }

    UML类图:

    五. 源码分析

    jdk中的集合框架Collect中的Iterate方法就是采用抽象工厂的方式实现,还是日志矿机的logback的getLogger也是。

  • 相关阅读:
    NTP服务器搭建
    Linux安装MongoDB 4.4.2
    CentOS安装Zookeeper 3.6.2
    CentOS安装Redis 6.0.9
    MacBook Home End
    SLES Install
    cucumber soapui test web services
    S/4 HANA Solution Manager
    Linux下创建新用户
    su with hyphen and without
  • 原文地址:https://www.cnblogs.com/FanJava/p/9965138.html
Copyright © 2011-2022 走看看