设计模式之 工厂方法模式

一、定义

定义一个用于创建对象的接口,让子类决定实例化那个类。工厂方法使一个类的实例化延迟到其子类。

二、结构

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
  2. 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

工厂模式

三、实例

源码:gitee

image-20200901002955169

  1. 定义抽象产品,要求子类实现方法 info(string)
public abstract class AbstractMyLog {
    /**
     * 记录日志
     *
     * @param msg 日志内容
     */
    public abstract void info(String msg);
}
  1. 定义抽象接口工厂,要求子类实现创建实现类的方法 createMyLog()
public interface IAbstractMyLogFactory {
    /**
     * 创建对应
     *
     * @return 具体实现类
     */
    AbstractMyLog createMyLog();
}
  1. 实现具体的产品类
/*** **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 + "]");
    }
}
  1. 定义创建具体产品类的工厂
/*** 数据库创建工厂*/
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();
    }
}
  1. 使用工厂
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("哈哈哈");
    }
}
// 输出:
// 远程服务器 <<< [哈哈哈]
// 数据库 <<< [哈哈哈]
// 本地文件 <<< [哈哈哈]
posted @ 2020-09-01 00:49  喵喵扑  阅读(188)  评论(0编辑  收藏  举报