六&七、工厂模式

2022-09-21 09:59:32 浏览数 (2)

工厂模式

作用

唯一的职责就是创建对象,将复制的创建过程,获取对象的逻辑与对象的使用进行解耦。

分为简单工厂、工厂方法、抽象工厂。

简单工厂

对象获取逻辑复杂时,例如根据文件类型获取对应的解析器,解析器有很多,就需要在使用对象前,进行臃肿的逻辑判断,才能获取对应的解析器对象。造成获取对象与使用对象耦合,不好扩展。后续新增解析器,又得在获取对象那里添砖加瓦了,不符合开闭原则。

将复杂的、需要扩展的对象创建和对象获取抽取出来,就是简单工厂了。

ParserFactory 简单工厂类

代码语言:javascript复制
public class ParserFactory {
    // 如果是单例,可使用依赖注入优化
    private static Map<String, Supplier<Parser>> instances= Maps.newHashMap();

    static {
        instances.put(ParserConstant.JSON, JsonParser::new);
        instances.put(ParserConstant.XML,XmlParser::new);
        instances.put(ParserConstant.YMAL, YmalParser::new);
    }

    public static Parser newInstance(String format) {
        return instances.get(format)
                        .get();
    }
}

工厂方法

如果创建对象过程复杂,多个对象创建逻辑都放到简单工厂里,在类这个抽象层面来看,是不符合单一职责原则的。于是将各个对象创建过程封装到单独的工厂类里,然后创建工厂的工厂,用于封装获取工厂类的逻辑。这点类似于简单工厂类,只是获取的是工厂对象而非目标对象罢了。

抽象工厂

抽象工厂是对工厂方法里的工厂进行扩展,每个工厂能产生不同类型的对象(不常见)

扩展

在JDK中工厂方法的命名有些规范

  1. valueOf() 返回与入参相等的对象 例如 Integer.valueOf()
  2. getInstance() 返回单例对象 例如 Calendar.getInstance() 特殊情况:Calendar.getInstance()返回的不是单例
  3. newInstance() 每次调用时返回新的对象 例如 HelloWorld.class.getConstructor().newInstance()

0 人点赞