一、定义
定义一个用于创建对象的接口,让子类决定实例化那个类。工厂方法使一个类的实例化延迟到其子类。
二、结构
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
三、实例
源码:gitee
- 定义抽象产品,要求子类实现方法 info(string)
public abstract class AbstractMyLog {
/**
* 记录日志
*
* @param msg 日志内容
*/
public abstract void info(String msg);
}
- 定义抽象接口工厂,要求子类实现创建实现类的方法 createMyLog()
public interface IAbstractMyLogFactory {
/**
* 创建对应
*
* @return 具体实现类
*/
AbstractMyLog createMyLog();
}
- 实现具体的产品类
/*** **DatabaseLog 数据库实现类 */
public class DatabaseLog extends AbstractMyLog {
@Override
public void info(String msg) {
System.out.println("// 数据库 <<< [" + msg + "]");
}
}
/*** **LocalFileLog 本地文件实现类*/
public class LocalFileLog extends AbstractMyLog {
@Override
public void info(String msg) {
System.out.println("// 本地文件 <<< [" + msg + "]");
}
}
/*** **ServiceLog 保存远程服务器实现类 */
public class ServiceLog extends AbstractMyLog {
@Override
public void info(String msg) {
System.out.println("// 远程服务器 <<< [" + msg + "]");
}
}
- 定义创建具体产品类的工厂
/*** 数据库创建工厂*/
public class DatabaseLogFactory implements IAbstractMyLogFactory {
@Override
public AbstractMyLog createMyLog() {
return new DatabaseLog();
}
}
/*** 本地文件创建工厂*/
public class LocalFileLogFactory implements IAbstractMyLogFactory {
@Override
public AbstractMyLog createMyLog() {
return new LocalFileLog();
}
}
/*** 保存远程服务器创建工厂 */
public class ServiceLogFactory implements IAbstractMyLogFactory {
@Override
public AbstractMyLog createMyLog() {
return new ServiceLog();
}
}
- 使用工厂
public class LogTest {
public static void main(String[] args) {
System.out.println("// 输出:");
IAbstractMyLogFactory serviceLogFactory = new ServiceLogFactory();
AbstractMyLog serviceLog = serviceLogFactory.createMyLog();
serviceLog.info("哈哈哈");
IAbstractMyLogFactory databaseLogFactory = new DatabaseLogFactory();
AbstractMyLog databaseLog = databaseLogFactory.createMyLog();
databaseLog.info("哈哈哈");
IAbstractMyLogFactory localFileLogFactory = new LocalFileLogFactory();
AbstractMyLog localLog = localFileLogFactory.createMyLog();
localLog.info("哈哈哈");
}
}
// 输出:
// 远程服务器 <<< [哈哈哈]
// 数据库 <<< [哈哈哈]
// 本地文件 <<< [哈哈哈]