您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——简单工厂

小志的博客 发布时间:2020-05-05 22:34:58 ,浏览量:0

目录结构
    • 一、简单工厂定义与类型
    • 二、简单工厂适用场景
    • 三、简单工厂优点
    • 四、简单工厂缺点
    • 五、简单工厂示例
    • 六、jdk源码中使用简单工厂的示例

一、简单工厂定义与类型

1、定义:由一个工厂对象决定创建出哪一种产品类的实例 2、类型:创建型,但不属于GOF23种设计模式

二、简单工厂适用场景

1、工厂类负责创建的对象比较少 2、客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

三、简单工厂优点

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

四、简单工厂缺点

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

五、简单工厂示例

1、示例

  • 没有使用简单工厂示例如下: (1)、定义一个视频抽象类,创建一个生产视频的抽象方法
package com.rf.designPatterns.simpleFactory.test1;
/**
 * @description: 定义一个视频抽象类
 * @author: xiaozhi
 * @create: 2020-05-05 14:33
 */
public abstract class Video extends com.rf.designPatterns.simpleFactory.test3.Video {
    //生产视频的一个抽象方法
    public abstract void product();
}

(2)、定义一个java视频类,继承视频抽象类,实现生产视频的方法

package com.rf.designPatterns.simpleFactory.test1;
/**
 * @description: 定义一个java视频类
 * @author: xiaozhi
 * @create: 2020-05-05 14:35
 */
public class JavaVideo extends Video {
    @Override
    public void product() {
        System.out.println("录制java视频");
    }
}

(3)、定义一个python视频类,继承视频抽象类,实现生产视频的方法

package com.rf.designPatterns.simpleFactory.test1;
/**
 * @description: 定义一个python视频类
 * @author: xiaozhi
 * @create: 2020-05-05 14:35
 */
public class PythonVideo extends Video {
    @Override
    public void product() {
        System.out.println("录制python视频");
    }
}

(4)、定义一个测试类

package com.rf.designPatterns.simpleFactory.test1;
/**
 * @description: 测试类
 * @author: xiaozhi
 * @create: 2020-05-05 14:36
 */
public class Test {
    public static void main(String[] args) {
        Video video1 = new JavaVideo();
        video1.product();
        Video video2 = new PythonVideo();
        video2.product();
    }
}

(5)、输出结果如下:

在这里插入图片描述 (6)、类图如下: 在这里插入图片描述 2、示例

  • 利用逻辑判断的方式使用简单工厂示例如下: (1)、定义一个视频抽象类,创建一个生产视频的抽象方法
package com.rf.designPatterns.simpleFactory.test2;
/**
 * @description: 定义一个视频抽象类
 * @author: xiaozhi
 * @create: 2020-05-05 14:33
 */
public abstract class Video extends com.rf.designPatterns.simpleFactory.test3.Video {
    //生产视频的一个抽象方法
    public abstract void product();
}

(2)、定义一个java视频类,继承视频抽象类,实现生产视频的方法

package com.rf.designPatterns.simpleFactory.test2;
/**
 * @description: 定义一个java视频类
 * @author: xiaozhi
 * @create: 2020-05-05 14:35
 */
public class JavaVideo extends Video {
    @Override
    public void product() {
        System.out.println("录制java视频");
    }
}

(3)、定义一个python视频类,继承视频抽象类,实现生产视频的方法

package com.rf.designPatterns.simpleFactory.test2;
/**
 * @description: 定义一个python视频类
 * @author: xiaozhi
 * @create: 2020-05-05 14:35
 */
public class PythonVideo extends Video {
    @Override
    public void product() {
        System.out.println("录制python视频");
    }
}

(4)、定义一个成产视频的工厂类

package com.rf.designPatterns.simpleFactory.test2;
/**
 * @description: 成产视频的工厂类
 * @author: xiaozhi
 * @create: 2020-05-05 14:42
 */
public class VideoFactory {
    public Video getVideo(String type){
        if("java".equalsIgnoreCase(type)){
            return new JavaVideo();
        }else if("python".equalsIgnoreCase(type)){
            return new PythonVideo();
        }
        return null;
    }
}

(5)定义一个测试类

package com.rf.designPatterns.simpleFactory.test2;
/**
 * @description: 测试类
 * @author: xiaozhi
 * @create: 2020-05-05 14:45
 */
public class Test {
    public static void main(String[] args) {
        VideoFactory videoFactory = new VideoFactory();
        Video video1 = videoFactory.getVideo("java");
        video1.product();
        Video video2 = videoFactory.getVideo("python");
        video2.product();
    }
}

(6)、输出结果如下: 在这里插入图片描述 (7)、类图如下: 在这里插入图片描述 3、示例

  • 利用java反射机制使用简单工厂示例如下:

(1)、定义一个视频抽象类,创建一个生产视频的抽象方法

package com.rf.designPatterns.simpleFactory.test3;
/**
 * @description: 定义一个视频抽象类
 * @author: xiaozhi
 * @create: 2020-05-05 14:33
 */
public abstract class Video extends com.rf.designPatterns.simpleFactory.test3.Video {
    //生产视频的一个抽象方法
    public abstract void product();
}

(2)、定义一个java视频类,继承视频抽象类,实现生产视频的方法

package com.rf.designPatterns.simpleFactory.test3;
/**
 * @description: 定义一个java视频类
 * @author: xiaozhi
 * @create: 2020-05-05 14:35
 */
public class JavaVideo extends Video {
    @Override
    public void product() {
        System.out.println("录制java视频");
    }
}

(3)、定义一个python视频类,继承视频抽象类,实现生产视频的方法

package com.rf.designPatterns.simpleFactory.test3;
/**
 * @description: 定义一个python视频类
 * @author: xiaozhi
 * @create: 2020-05-05 14:35
 */
public class PythonVideo extends Video {
    @Override
    public void product() {
        System.out.println("录制python视频");
    }
}

(4)、定义一个成产视频的工厂类

package com.rf.designPatterns.simpleFactory.test3;
/**
 * @description: 利用反射机制成产视频的工厂类
 * @author: xiaozhi
 * @create: 2020-05-05 14:42
 */
public class VideoFactory {
    public Video getVideo(Class c){
        Video video=null;
        try {
            video = (Video) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return  video;
    }
}

(5)定义一个测试类

package com.rf.designPatterns.simpleFactory.test3;
/**
 * @description: 测试类
 * @author: xiaozhi
 * @create: 2020-05-05 14:45
 */
public class Test {
    public static void main(String[] args) {
        VideoFactory videoFactory = new VideoFactory();
        //应用层只需要告诉工厂需要录制哪种类型的视频即可
        Video video1=videoFactory.getVideo(JavaVideo.class);
        video1.product();

        Video video2=videoFactory.getVideo(PythonVideo.class);
        video2.product();
    }
}

(6)、输出结果如下: 在这里插入图片描述 (7)、类图如下: 在这里插入图片描述

六、jdk源码中使用简单工厂的示例

1、Calendar类中使用到了简单工厂 (1)、Ctrl+Shift+N,输入Calendar找到Calendar.java类,双击打开Calendar.java类,如下图: 在这里插入图片描述 (2)、在Canlendar.java类中,按【Alt+7】,打开Structure结构视图,找到getInstance()方法。双击getInstance()方法,在Canlendar.java类定义到代码1611行。如下图: 在这里插入图片描述在这里插入图片描述 (3)按【ctrl】,点击createCalendar方法,进入createCalendar方法内部,该方法用static修饰,说明并不考虑扩展性,如下图画红色框的部分用的就是简单工厂。 在这里插入图片描述在这里插入图片描述 (4)、类图如下: 在这里插入图片描述在这里插入图片描述

在这里插入图片描述 (5)、进入类图中Calendar中JapaneseImperialCalendar的实现方法,如下图: 在这里插入图片描述在这里插入图片描述 2、jdbc的数据库连接利用反射机制使用到了简单工厂 (1)、按【Ctrl+Shift+N】,输入DriverManager找到DriverManager.java类,双击打开DriverManager.java类,如下图: 在这里插入图片描述在这里插入图片描述(2)、在DriverManager.java类中,按【Alt+7】,打开Structure结构视图,找到getConnection(String url)方法。双击getConnection(String url)方法,在DriverManager.java类定义到代码266行。如下图: 在这里插入图片描述(3)、按【ctrl】,点击getConnection方法,进入getConnection方法内部,如下图画红色框的部分用的就是简单工厂。 在这里插入图片描述在这里插入图片描述在这里插入图片描述3、logger日志使用到了简单工厂 (1)、maven项目的pom文件中引入slf4j和logback依赖,如下图: 在这里插入图片描述 (2)、按【Ctrl+Shift+N】,输入LoggerFactory找到LoggerFactory.java文件,双击打开LoggerFactory.java文件,如下图: 在这里插入图片描述在这里插入图片描述 (3)在LoggerFactory.java文件中,按【Alt+7】,打开Structure结构视图,找到getLogger(String name) 方法。双击getLogger(String name) 方法,在LoggerFactory.java文件中定义到代码240行。如下图: 在这里插入图片描述(4)按【Ctrl+Alt】,鼠标左键点击getLogger方法,进入getLogger方法的实现类LoggerContext中。如下图: 在这里插入图片描述在这里插入图片描述 (5)、画红色框部分使用了简单工厂 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0439s