赞
踩
背景: 代码中存在根据不同条件创建不同对象
的场景。例如:
if ("json".equals(name)) {
return new JsonConfigParser();
} else if ("xml".equals(name)) {
return new XmlConfigParser();
} else if ("yaml".equals(name)) {
return new YamlConfigParser();
}
存在的问题:
解决方案: 使用简单工厂。抽象出一个Factory类,负责对象的创建,并提供给外部使用的方法。
提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类或普通类。
多例场景下
:所有对象抽象出一层Factory对象,但中间的if…else逻辑没有去掉,修改时违背了开闭原则;
单例场景
:使用Map提前缓存单例对象。
优点:
1. 封装性好。对创建对象的行为封装了一层Factory类,实现了面向接口编程;
2. 松耦合。将对象创建和使用解耦,实现了松耦合;
3. 可维护性好。将创建对象的行为统一到Factory类中,实现【一处修改,多处联动】,维护性大大提高;
4. 符合单一职责。将创建对象的行为放到Factory类中,实现了Factory类的职责单一。
缺点:
1. 客户端需要知道传入的参数是什么含义,才能准确创建对象,增加了复杂度;
2. 若需要新增加对象的类型,需要修改Factory类中的if..else逻辑,违背了开闭原则
主要解决
:简单工厂模式下的多例场景中的if…else问题,使修改代码符合开闭原则。
定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到其子类中。
方案1
:使用多态的方式,针对每一个对象,单独创建一个工厂类,但是在使用端又引入了if…else来判断使用哪个Factory类
优化方案
:Factory一般场景下是单例
的,考虑使用Map来进行缓存【SpringBoot中可以使用@PostConstuct
注解实现无缝注入】
优点:
1. 符合开闭原则
缺点:
1. 增加了类的个数,降低了可读性
背景: 简单工厂和工厂方法解决的是单一维度的分类方式。比如按照颜色给水果进行分类,但是若新增分类方式,按照品种进行分类,则需要创建一倍的工厂对象,增加了系统复杂度。
解决方案: 一个工厂对象可以创建不同类型
的对象,可以有效降低工厂对象的个数。
单一维度:
采用简单工厂或工厂方法模式
多维度:
采用抽象工厂模式
某些场景下: 如果对象不可复用,那工厂类每次都要返回不同的对象。如果我们使用简单工厂模式来实现,就只能选择第一种包含 if 分支逻辑的实现方式。如果我们还想避免烦人的 if-else 分支逻辑,这个时候,我们就推荐使用工厂方法模式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。