23种设计模式(1)
一、工厂模式
1. 作用
实现了创建者与使用者的分离
2. 本质
实例化对象不使用new,用工厂方法代替
3. 分类
(1)简单工厂模式
【1】Car接口
【2】大众车类
【3】小米车类
【4】工厂类
【5】顾客类
(2)工厂方法模式
【1】Car接口(同上)
【2】大众车类(同上)
【3】小米车类(同上)
【4】工厂接口
【5】大众工厂类
【6】小米工厂类
【7】顾客类
工厂方法模式:要是有新的车添加,只需要增加该车的类以及该车的工厂类即可
二、单例模式
1. 作用
为什么会有人想要控制一个类所拥有的实例数量?
最常见的原因是唯一的控制某些共享资源 (例如数据库或文件) 的访问权限。
2. 本质
能够保证一个类只有一个实例, 并提供一个访问该实例的方法
3. 实现方法
(1)将默认构造器私有, 防止其他对象使用单例类的 new运算符。
(2)新建一个公共的静态方法,该方法要么返回现存的对象实例,要么 “偷偷” 调用私有构造器来创建对象, 并将其保存在一个静态成员变量中,然后返回该对象。此后所有对于该函数的调用都将返回这一缓存对象。
4. 分类
(1)饿汉模式
(2)懒汉模式
5. 懒汉模式存在的问题
多线程,使用synchronized
,解决多个线程同时争抢相同的公共资源
new出对象时,会出现指令重排,使用volatile
三、抽象工厂模式
1. 特点
抽象工厂作为一个一个接口, 可用于创建每个系列各个不同产品。 只要代码通过该接口创建对象, 那么就不会生成与应用程序已生成的产品类型不一致的产品。
2. 优点
(1)可以确保同一工厂生成的产品相互匹配。
(2)可以避免客户端和具体产品代码的耦合。
(3)单一职责原则。可以将产品生成代码抽取到同一位置,使得代码易于维护。
(4)开闭原则。 向应用程序中引入新产品变体时,无需修改客户端代码。
3. 示例
【1】电视接口
【2】洗衣机接口
【3】小米电视
【4】小米洗衣机
【5】华为电视机
【6】华为洗衣机
【7】抽象工厂
【8】小米工厂
【9】华为工厂
【10】客户端
参考:B站狂神说、《深入设计模式》https://refactoringguru.cn/design-patterns/factory-method