设计模式之 简单工厂模式

一、定义

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

二、结构

  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]
原文地址:https://www.cnblogs.com/lixingwu/p/13516268.html