SLF4J(四)-工厂模式/抽象工厂模式在SLF4J中的实践

x33g5p2x  于2021-12-28 转载在 其他  
字(1.5k)|赞(0)|评价(0)|浏览(290)

早前看设计模式的时候,发现这套东西根本不太适合小项目或者项目开发初期,但最近发现SLF4J这个项目其实也挺小的,但是设计模式玩的挺溜的,然后就想着总结一下,这个项目中用到的设计模式。

工厂模式

定义:工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

实践

  • ILoggerFactory: 用于创建Logger对象
public interface ILoggerFactory {
    public Logger getLogger(String name);
}
  • IMarkerFactory:用于创建Marker,附带的还有检查marker是否存在等功能
public interface IMarkerFactory {
    Marker getMarker(String name);
    boolean exists(String name);
    boolean detachMarker(String name);
    Marker getDetachedMarker(String name);
}

抽象工厂模式

  • 定义:抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

  • 解读:这个定义看上去还是挺难理解的, 可以这么说抽象工厂就是一系列工厂的合集。譬如看下面的例子,SLF4JServiceProvider包含了ILoggerFactory 和IMarkerFactory两个工厂,SLF4JServiceProvider就是对抽象工厂模式的一个运用。

  • 这样做有什么好处呢?更换产品实现比较容易。
    ILoggerFactory 和 IMarkerFactory是日志系统中的两个重要的类,如果没有SLF4JServiceProvider这个接口,现在要把logback替换成log4j,那么这两个类就要分别去做修改。 现在有了SLF4JServiceProvider这个接口,我们只需要直接替换SLF4JServiceProvider的实现就可以完成替换了。
    当然有的人,还是会觉得不就改两下么,也不麻烦。但是,你想一下,当日志系统中包含了有几十个这样的工厂类的,你再去一个一个的修改是不是就很麻烦了,而且很容易出错了,这就是这个模式的优势了。

  • 缺点:在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
    开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。

实践

public interface SLF4JServiceProvider {
    public ILoggerFactory getLoggerFactory();
    
    public IMarkerFactory getMarkerFactory();
     
    public MDCAdapter getMDCAdapter();
    
    public String getRequesteApiVersion();
    
    public void initialize();
}

相关文章