美文网首页
创建型模式之工厂方法模式

创建型模式之工厂方法模式

作者: sunpy | 来源:发表于2018-11-12 11:27 被阅读6次

介绍

工厂方法模式本身是一种创建型模式,用来创建对象;工厂方法模式本身就是为每一个种类的对象创建一个对应的工厂来创建对象。


工厂方法模式UML图.png

实例代码

  1. 抽象产品类
public interface Product {
    public void produce();
}
  1. 具体产品类
/**
 * @description 具体产品:铁制产品
 * 
 * @author sunpy
 * @date 2018年11月12日  上午10:34:54
 */
public class SteelProduct implements Product{

    @Override
    public void produce() {
        System.out.println("生产铁制产品");
    }
}

/**
 * @description 具体产品:石制产品
 * 
 * @author sunpy
 * @date 2018年11月12日  上午10:35:11
 */
public class StoneProduct implements Product{

    @Override
    public void produce() {
        System.out.println("生产石制产品");
    }
}
  1. 抽象工厂类
/**
 * @description 抽象工厂
 * 
 * @author sunpy
 * @date 2018年11月12日  上午10:35:59
 */
public interface ProductFactory {

    public Product provide();
}
  1. 具体工厂类
public class StoneFactory implements ProductFactory {

    @Override
    public Product provide() {
        
        return new StoneProduct();
    }
}

public class SteelFactory implements ProductFactory{

    @Override
    public Product provide() {
        
        return new SteelProduct();
    }
}

实际应用的设计

工厂方法模式在slf4j中的日志工厂创建Logger类的应用

  1. 抽象工厂
public interface ILoggerFactory {

    public Logger getLogger(String name);
}
  1. 具体工厂
// log4j获取Logger的具体工厂类
public class Log4jLoggerFactory implements ILoggerFactory {
    ....

    public Logger getLogger(String name) {
        Logger slf4jLogger = loggerMap.get(name);
        if (slf4jLogger != null) {
            return slf4jLogger;
        } else {
            org.apache.log4j.Logger log4jLogger;
            if (name.equalsIgnoreCase(Logger.ROOT_LOGGER_NAME))
                log4jLogger = LogManager.getRootLogger();
            else
                log4jLogger = LogManager.getLogger(name);

            Logger newInstance = new Log4jLoggerAdapter(log4jLogger);
            Logger oldInstance = loggerMap.putIfAbsent(name, newInstance);
            return oldInstance == null ? newInstance : oldInstance;
        }
    }
}

// slf4j默认的SubstituteLoggerFactory具体工厂类获取Logger
public class SubstituteLoggerFactory implements ILoggerFactory {
    ....
    
    synchronized public  Logger getLogger(String name) {
        SubstituteLogger logger = loggers.get(name);
        if (logger == null) {
            logger = new SubstituteLogger(name, eventQueue, postInitialization);
            loggers.put(name, logger);
        }
        return logger;
    }
}
  1. 抽象产品类
public interface Logger {
    ...
}
  1. 具体产品类
    Log4j只是额外加上了一个抽象模板类MarkerIgnoringBase ,让功能延伸到子类去实现的而已。我们还可以发现其又应用了类适配器模式,去适配LocationAwareLogger这个接口,这个不属于本篇内容,有空完整解析下slf4j的架构和设计模式。
// SubstituteLoggerFactory工厂生产的具体产品SubstituteLogger
public class SubstituteLogger implements Logger {
    ...
}


public abstract class MarkerIgnoringBase extends NamedLoggerBase implements Logger {

}

public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements LocationAwareLogger, Serializable {

}

总结

工厂方法模式vs简单工厂模式
简单工厂模式:将工厂类生产产品的逻辑进行了封装,虽然表面上抽象产品和具体产品实现了低耦合,但是工厂类和产品类却耦合在了一起,如果想增加一个新的产品却要修改工厂类,违背了开闭原则。
工厂方法模式:主要就是将工厂类和产品类进行了解耦,让一个工厂对应一类产品类,让不同种类的产品对应不同的工厂,增强了扩展性。

相关文章

  • 设计模式(1) 工厂方法模式

    创建型模式 简单工厂模式 工厂方法模式IOC与工厂方法模式的结合泛型工厂委托工厂 创建型模式 创建型模式可以隔离客...

  • 简单工厂模式

    Android进阶之设计模式 简单工厂模式 简单工厂模式(又叫作静态工厂方法模式), 其属于创建型设计模式,但并不...

  • Kotlin(八)kotlin设计模式-创建型

    创建型模式 - 工厂 Kotlin里面几种主流创建型设计模式:工厂方法模式,抽象工厂模式,构建者模式 8.1 伴生...

  • 工厂方法模式

    什么是工厂方法模式 工厂方法模式又称为工厂模式,属于创建型设计模式。工厂方法模式定义了一个创建对象的接口,但由子类...

  • 简单工厂模式

    工厂方法模式(Factory Pattern)是创建型设计模式之一。 一、定义 简单工厂模式又称为静态方法工厂模式...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • JavaScript 23种设计模式

    创建型: 抽象工厂模式(Abstract Factory) 构建者模式(Builder) 工厂方法模式(Facto...

  • 设计模式[2]-工厂方法模式-Factory Method Pa

    1. 工厂方法模式简介 工厂方法模式(Factory Method Pattern)是创建型的设计模式,和简单工厂...

  • 工厂模式-简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式 工厂模式是一种比较常见的创建型设计模式,分为简单工厂模式、工厂方法模式、抽象工厂模式 工厂模式旨在把对象...

  • 设计模式[3]-抽象工厂模式-Abstract Factory

    1.抽象工厂模式介绍 抽象工厂模式是创建型设计模式,可以创建一组对象。与工厂方法模式相比,抽象工厂模式中的具体工厂...

网友评论

      本文标题:创建型模式之工厂方法模式

      本文链接:https://www.haomeiwen.com/subject/cisqfqtx.html