您现在的位置是:首页 > 正文

java设计模式精讲 Debug 方式+内存分析 第4章 简单工厂模式

2024-02-29 10:48:50阅读 7

4-1 简单工厂讲解

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

4-2 简单工厂coding

有一个视频的基类(是一个抽象类)

public abstract class Video {
    public abstract void product();
}

有两个类继承它,并对里面的方法进行实现:

public class JavaVideo extends Video {
    @Override
    public void product() {
        System.out.println("录制Java课程视频");
    }
}
public class Python extends Video {
    @Override
    public void product() {
        System.out.println("录制Python的课程视频");
    }
}

现在,我们有一个简单工厂类:

public class VideoFactory {
    public Video getVideo(String type) {
        if ("java".equalsIgnoreCase(type)) {
            return new JavaVideo();
        } else if ("python".equalsIgnoreCase(type)) {
            return new Python();
        }
        return null;
    }
}

测试代码如下:

public class Test {
    public static void main(String[]args){
        VideoFactory videoFactory = new VideoFactory();
        Video video = videoFactory.getVideo("java");
        if (video == null) {
            return;
        }
        video.product();
    }
}

执行结果:

录制Java课程视频

这个就是现在的类图:
在这里插入图片描述
具体的产生类的方法都在工厂类里面,这个就是简单工厂模式;


但是,如果我们还要录制一个FE的前端课程,那么,我们就要对工厂类里面的方法进行扩展,那么这个并不符合开闭原则:


现在,我们来用反射来演进一下:

public class VideoFactory {
    public Video getVideo(Class clazz) {
        Video video = null;
        try {
            video = (Video) Class.forName(clazz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return video;
    }
}

测试如下:

public class Test {
    public static void main(String[]args){
        VideoFactory videoFactory = new VideoFactory();
        Video video = videoFactory.getVideo(JavaVideo.class);
        if (video == null) {
            return;
        }
        video.product();
    }
}

这里从一定原则上讲是符合开闭原则的:
如果我们要new什么类,那我们就只需要传入这个类的类型就可以了,而这个工厂是需要变化的;

4-3 简单工厂JDK源码解析

现在,我们来看一下,在JDK源码里面使用简单工厂的类:

  • Calendar
    在这里插入图片描述

在这里插入图片描述

  • DriverManager里面的getConnection()方法:
    在这里插入图片描述

以下是之后要查看源码需要导入的依赖:

<dependencies>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>7.0.64</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>


        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.7.3</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${org.mybatis.spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${org.mybatis.version}</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.11</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.12</version>
        </dependency>

        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
            <!--<scope>runtime</scope>-->
        </dependency>


        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.2</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>


        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5</version>
        </dependency>


        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!--<scope>test</scope>-->
        </dependency>

        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.3</version>
        </dependency>


        <!-- id加密解密 -->
        <dependency>
            <groupId>org.hashids</groupId>
            <artifactId>hashids</artifactId>
            <version>1.0.1</version>
        </dependency>


        <!-- ftpclient -->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.1</version>
        </dependency>

        <!-- file upload -->

        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.2</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.0.1</version>
        </dependency>




        <!-- mybatis pager -->

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.1.0</version>
        </dependency>

        <dependency>
            <groupId>com.github.miemiedev</groupId>
            <artifactId>mybatis-paginator</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>0.9.4</version>
        </dependency>


        <!-- alipay -->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>
        <dependency>
            <groupId>commons-configuration</groupId>
            <artifactId>commons-configuration</artifactId>
            <version>1.10</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>2.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
        </dependency>

        <!-- 二期新增的 -->

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.6.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>

        <!-- spring session 单点登录 -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
            <version>1.2.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-avro</artifactId>
            <version>2.9.0</version>
        </dependency>
    </dependencies>

LoggerFactory这个类里面的getLogger方法:
在这里插入图片描述

网站文章

  • bzoj1087[SCOI2005][互不侵犯King] 状压DP

    状压DP

    2024-02-29 10:48:43
  • Electron框架的简单使用-node.js实现GUI软件开发

    Electron框架的简单使用-node.js实现GUI软件开发

    基于Node.js的GUI框架 NW.JS (Node-Webkit) Electron 使用HTML、CSS、JavaScript来构建UI、处理与用户的交互、同时不约而同的使用了开源浏览器Chro...

    2024-02-29 10:48:34
  • Linux搭建Redis缓存服务器

    Linux搭建Redis缓存服务器

    目录 1 Redis的安装 1.1 Redis的安装 1.2 连接redis 1.2.1 redis的启动: 1.2.2 Redis-cli 1.3 Redis五种数据类型 1 Redis的安装 1.1 Redis的安装 Redis是c语言开发的。 说明是自带环境的 安装redis需要c语言的编译环境。如果没有gcc需要在线安装。Yum install gcc-c++ ...

    2024-02-29 10:48:26
  • Java 面试题

    1) 以下哪个类是处理char类型的输入输出流的 *选择正确答案 Reader类 InputStream 类 OutputStream类 File类2) Java的类是多继承的,所有的类都从Object类派生而来的 * true false3 ) 对成员的访问控制保护最强的是 * public default private protected4) 以下是一个完整程序,哪一行,有效率问题 * pu

    2024-02-29 10:47:56
  • ZOJ3702(打表)

    Gibonacci number In mathematical terms, the normal sequence F(n) of Fibonacci numbers is defined by ...

    2024-02-29 10:47:50
  • echarts中xAxis的type=‘time’

    当type=time时,x轴不需要再另外设置data。只需要再series中的data设为二维数组,每个元素是时间戳和值。此时x轴会自定刻度间隔,需要自定义的话,使用splitNumber属性如想获取当前时间前24小时,每隔半小时显示一个随机数。把下面获得的data赋值给series中的data属性即可伪代码:let a = [];let now = Date.parse(new Da...

    2024-02-29 10:47:44
  • GCD全解-dispatch_queue-队列创建

    1、串行队列 2、并行队列 3、创建Queue

    2024-02-29 10:47:14
  • 2023年中国研究生数学建模竞赛E题(三):问题一b题:血肿扩张风险相关因素探索建模(一,主要是模型分析与建立)

    2023年中国研究生数学建模竞赛E题(三):问题一b题:血肿扩张风险相关因素探索建模(一,主要是模型分析与建立)

    2023年中国研究生数学建模竞赛E题(三):问题一b题:血肿扩张风险相关因素探索建模(一,主要是模型分析与建立)

    2024-02-29 10:47:06
  • js typeof

    if (that == null || "undefined" == typeof that) {return;} var bcd; //未定义 undefined function Check_data_type(obj) { if ("undefined" == typeof obj) {...

    2024-02-29 10:46:58
  • 原生 input输入框,按字符or字节数计算输入内容长度,超出部分截取掉。

    需求 这做的是一个原生输入框,按字节或者字符数计算内容长度,超出部分截取掉。 分析 首先,用maxlength肯定是不行的,因为,aaa的长度为3,啊啊啊的字节长度肯定是大于3的,但是maxlengt...

    2024-02-29 10:46:31