一、定义
定义一个用来创建其他类实例的类,这个类可以根据传入的参数返回对应的类的实例。
二、结构
- 工厂类(Factory):创建其他类实例的类。
- 抽象类:具体实现类的抽象实现,封装公共方法。
- 具体实现类:实现抽象类的类,做具体的功能实现。
三、场景
- 日志记录器:记录可能记录到本地文件、数据库、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,"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]