持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
1 不要去 开课吧 和子公司 问原因就 自己百度去
2 上节回顾/本节重点/上节思考题
2.1 本节讲解
最后一个问题有彩蛋
1. 什么时候该用工厂模式?相对于直接 new 来创建对象
2 用工厂模式来创建究竟有什么好处呢?
3 DI 容器跟我们讲的工厂模式又有何区别和联系?
4 DI 容器的核心功能有哪些
5 以及如何实现一个简单的 DI 容器?
2.3 上节 思考题解答
4 工厂模式 分类
4.1 工厂方法
4.2 抽象工厂(Abstract Factory)
public interface IConfigParserFactory {
IRuleConfigParser createRuleParser();
ISystemConfigParser createSystemParser();
//此处可以扩展新的parser类型,比如IBizConfigParser
}
public class JsonConfigParserFactory implements IConfigParserFactory {
@Override
public IRuleConfigParser createRuleParser() {
return new JsonRuleConfigParser();
}
@Override
public ISystemConfigParser createSystemParser() {
return new JsonSystemConfigParser();
}
}
public class XmlConfigParserFactory implements IConfigParserFactory {
@Override
public IRuleConfigParser createRuleParser() {
return new XmlRuleConfigParser();
}
@Override
public ISystemConfigParser createSystemParser() {
return new XmlSystemConfigParser();
}
}
// 省略YamlConfigParserFactory和PropertiesConfigParserFactory代码
5 那什么时候该用工厂方法模式,而非简单工厂模式呢?
基于这个设计思想,当对象的创建逻辑比较复杂,不只是简单的 new 一下就可以,而是要组合其他类对象,做各种初始化操作的时候,我们推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中,让每个工厂类都不至于过于复杂。而使用简单工厂模式,将所有的创建逻辑都放到一个工厂类中,会导致这个工厂类变得很复杂。
学习设计模式,是为了让代码更加简单,而不是更加复杂。能用简单的代码实现,并且逻辑也不复杂的,没必要用更加复杂的设计模式。
当创建逻辑比较复杂,是一个“大工程”的时候,我们就考虑使用工厂模式,封装对象的创建过程,将对象的创建和使用相分离。何为创建逻辑比较复杂呢?我总结了下面两种情况。第一种情况:类似规则配置解析的例子,代码中存在 if-else 分支判断,动态地根据不同的类型创建不同的对象。针对这种情况,我们就考虑使用工厂模式,将这一大坨 if-else 创建对象的代码抽离出来,放到工厂类中。还有一种情况,尽管我们不需要根据不同的类型创建不同的对象,但是,单个对象本身的创建过程比较复杂,比如前面提到的要组合其他类对象,做各种初始化操作。在这种情况下,我们也可以考虑使用工厂模式,将对象的创建过程封装到工厂类中。
6 使用工厂模式的最本质的参考标准
封装变化:创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。
代码复用:创建代码抽离到独立的工厂类之后可以复用。
隔离复杂性:封装复杂的创建逻辑,调用者无需了解如何创建对象。
控制复杂度:将创建代码抽离出来,让原本的函数或类职责更单一,代码更简洁。
7 工厂模式和 DI 容器有何区别?
实际上,DI 容器底层最基本的设计思路就是基于工厂模式的。DI 容器相当于一个大的工厂类,负责在程序启动的时候,根据配置(要创建哪些类对象,每个类对象的创建需要依赖哪些其他类对象)事先创建好对象。当应用程序需要使用某个类对象的时候,直接从容器中获取即可。正是因为它持有一堆对象,所以这个框架才被称为“容器”。
DI 容器相对于工厂模式的例子来说,它处理的是更大的对象创建工程。上节课讲的工厂模式中,一个工厂类只负责某个类对象或者某一组相关类对象(继承自同一抽象类或者接口的子类)的创建,而 DI 容器负责的是整个应用中所有类对象的创建。
8 DI 容器的核心功能有哪些?
总结一下,一个简单的 DI 容器的核心功能一般有三个:配置解析、对象创建和对象生命周期管理。
7 前面思考和应用场景解答 (在此之前 请再次思考前面的问题 )
7.1 实现一个线程安全的单例
一般使用 饿汉式 / 静态内部类
7.2 为什么要使用单例?
防止资源重复加载 造成浪费
7.3 单例存在哪些问题?
扩展性/多态/继承/抽象 等方面都收到影响,要仔细根据业务思考
7.4 单例与静态类的区别?
扩展性/多态/继承/抽象 等方面都收到影响,要仔细根据业务思考
7.5 有何替代的解决方案?
static / 依赖注入 / 工厂类等方式
7.6 springboot 开发的使用 单例模式能用在哪里
8 总结:
9 下节预知
- 工厂模式
11 思考题
单例的在实际场景中 怎么使用的,可以评论打出