• 设计模式之 简单工厂模式


    一、定义

    定义一个用来创建其他类实例的类,这个类可以根据传入的参数返回对应的类的实例。

    二、结构

    1. 工厂类(Factory):创建其他类实例的类。
    2. 抽象类:具体实现类的抽象实现,封装公共方法。
    3. 具体实现类:实现抽象类的类,做具体的功能实现。

    三、场景

    1. 日志记录器:记录可能记录到本地文件、数据库、远程服务器等,用户可以选择记录日志到什么地方。
    2. 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
    3. 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

    三、实例

    下面我们以 “日志记录器” 来举例说明:

    源码:gitee

    1、创建一个日志记录器的抽象类
    package lxw.designpattern.factory.mylog;
    
    /**
     * 日志记录器 抽象类
     */
    public abstract class AbstractMyLog {
    
        /**
         * 记录日志
         *
         * @param msg 日志内容
         */
        public abstract void info(String msg);
    }
    
    2、分别创建保存到本地文件、数据库、远程服务器的具体实现类
    package lxw.designpattern.factory.mylog.impl;
    
    import lxw.designpattern.factory.mylog.AbstractMyLog;
    
    /**
     * 保存到本地文件实现类
     *
     * @author https://www.cnblogs.com/lixingwu/
     */
    public class LocalFileLog extends AbstractMyLog {
        @Override
        public void info(String msg) {
            System.out.println("// 本地文件 <<< [" + msg + "]");
        }
    }
    
    package lxw.designpattern.factory.mylog.impl;
    
    import lxw.designpattern.factory.mylog.AbstractMyLog;
    
    /**
     * 保存到数据库实现类
     *
     * @author https://www.cnblogs.com/lixingwu/
     */
    public class DatabaseLog extends AbstractMyLog {
        @Override
        public void info(String msg) {
            System.out.println("// 数据库 <<< [" + msg + "]");
        }
    }
    
    package lxw.designpattern.factory.mylog.impl;
    
    import lxw.designpattern.factory.mylog.AbstractMyLog;
    
    /**
     * 保存远程服务器实现类
     *
     * @author https://www.cnblogs.com/lixingwu/
     */
    public class ServiceLog extends AbstractMyLog {
        @Override
        public void info(String msg) {
            System.out.println("// 远程服务器 <<< [" + msg + "]");
        }
    }
    
    3、创建日志工厂类,根据传入的参数返回对应的实现类
    package lxw.designpattern.factory.mylog;
    
    import lxw.designpattern.factory.mylog.impl.DatabaseLog;
    import lxw.designpattern.factory.mylog.impl.LocalFileLog;
    import lxw.designpattern.factory.mylog.impl.ServiceLog;
    
    /**
     * 日志工厂类
     *
     * @author https://www.cnblogs.com/lixingwu/
     */
    public class MyLogFactory {
    
        /**
         * 根据类型返回不同的实现类
         *
         * @param type 类型
         * @return 实现类的抽象
         */
        public static AbstractMyLog get(int type) {
            AbstractMyLog log = new LocalFileLog();
            switch (type) {
                case 1:
                case 2: log = new DatabaseLog();break;
                case 3: log = new ServiceLog();break;
                default: break;
            }
            return log;
        }
    }
    
    4、测试
    package lxw.designpattern.factory.mylog;
    
    /**
     * 测试
     *
     * @author https://www.cnblogs.com/lixingwu/
     */
    public class MyLogTest {
    
        public static void main(String[] args) {
            
            System.out.println("// 输出结果:");
            
            AbstractMyLog log = MyLogFactory.get(0);
            log.info("你好鸭");
    
            AbstractMyLog log1 = MyLogFactory.get(1);
            log1.info("你好鸭1");
    
            AbstractMyLog log2 = MyLogFactory.get(2);
            log2.info("你好鸭2");
        }
    }
    
    // 输出结果:
    // 本地文件 <<< [你好鸭]
    // 数据库 <<< [你好鸭1]
    // 远程服务器 <<< [你好鸭2]
    
  • 相关阅读:
    5分钟带你了解Kafka的技术架构
    聊聊我的知识体系
    你分得清楚Maven的聚合和继承吗?
    为抖音而生的多闪,如何获取抖音的用户数据?
    消息中间件系列第3讲:使用消息队列需要考虑的几个问题
    消息中间件系列第2讲:如何进行消息队列选型?
    消息中间件系列第1讲:为什么要用消息队列?
    JVM规范系列开篇:为什么要读JVM规范?
    安全编码实践之三:身份验证和会话管理防御
    安全编码实践之二:跨站脚本攻击防御
  • 原文地址:https://www.cnblogs.com/lixingwu/p/13516268.html
Copyright © 2020-2023  润新知