1. 创建型(5)
- (1)单例模式 Singleton:https://blog.csdn.net/qq_41157876/article/details/111520172
- 懒汉,饿汉
- 三种常用的线程安全:DCL,静态内部类,枚举类
- (2,3)工厂模式 Factory:https://blog.csdn.net/qq_41157876/article/details/111554105
- 简单工厂:if...else判断,违反开闭
- 工厂方法:Product接口,Factory接口(实现类FactoryA,FactoryB...)
- 抽象工厂:ProductA接口,ProductB接口,Factory接口 ——> 每个具体的工厂可以聚合多种产品
- (4)建造者模式 Builder:https://blog.csdn.net/qq_41157876/article/details/111587912
- 有些属性不是必须的,可以构建静态内部类Builder,利用流式方法创建
- (5)原型模式 Prototype:https://blog.csdn.net/qq_41157876/article/details/112007433
- 深拷贝 / 浅拷贝:相比new有更高性能
- 浅拷贝:
- 实现Cloneable接口,重写clone()方法
- 只克隆对象本身和值类型,引用类型共用一个地址
- 深拷贝:
- 实现Serializable接口,用流实现
- 全部都克隆
备注:
- 工厂模式 vs 建造者模式
- 前者创建简单对象,后者创建复杂对象
2. 结构型模式(7)
- (6)适配器模式 Adapter:https://blog.csdn.net/qq_41157876/article/details/112003485
- 三种类别
- 类适配:Adapter(继承Adaptee类,实现Target接口)中,重写Target的方法(在里面调用并修改super的方法)
- 继承结构使得代码灵活,但是由于单继承,Adaptee只能有一个
- 对象适配:Adapter(聚合Adaptee类,实现Target接口)中,重写Target的方法(在里面调用并修改属性adaptee的方法)
- 可以聚合多个adaptee,但是代码改起来麻烦
- 缺省适配:Adapter(实现Target接口,所有方法空实现,供使用的时候复用重写)
- 最为推荐(复用性,扩展性,解耦),但是最为难理解
- (7)代理模式 Proxy:https://blog.csdn.net/qq_41157876/article/details/111604861
- 静态代理:代码写死了
- JDK动态代理:接口代理,实现invocationHandler接口(把要代理的接口作为属性传入),重写invoke()方法,调用静态方法Proxy.newProxyInstance()返回代理对象
- cglib动态代理:子类代理,引入cglib的jar包,把代理对象的class文件加载进来,通过修改其字节码生成子类来处理
- (8)装饰(器)模式 Decorator:https://blog.csdn.net/qq_41157876/article/details/111562542
- 一个类可以分成主成分和装饰者,比如咖啡
- 主成分——咖啡种类:意大利浓咖啡,无因咖啡,猫屎咖啡等等
- 装饰者——调料:牛奶,豆浆,抹茶,巧克力粉等等
- (9)桥接模式 Bridge:https://blog.csdn.net/qq_41157876/article/details/111574637
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。比如发送消息
- 维度一:方式:邮件 / 短信
- 维度二:内容:特别消息 / 普通消息
- (10)外观(门面)模式 Facade:https://blog.csdn.net/qq_41157876/article/details/111614293
- 比如打车接口有很多实现类:快车打车,优享打车,货车打车
- 可以设计门面:打车类,把所有的实现类作为属性扔进去,向外只暴露门面类
- (11)组合模式 Composite:https://blog.csdn.net/qq_41157876/article/details/111830874
- 类似于树形结构,比如Employee类中有List<Employee>属性,存放该Employee的下属
- (12)享元模式 Flyweight:https://blog.csdn.net/justloveyou_/article/details/55045638
- 单纯享元(所有单位都可以共享)和复合享元(复合类不能共享,单纯类可以共享)
- 类似JAVA种的String池,有则直接从池中获取,没有则创建
- 可以节约内存空间,提高系统的性能
备注:
- 桥接模式 vs 装饰(器)模式
- 接口和抽象的关系
- 桥接模式:抽象类与接口是组合关系(松耦合),抽象类放入了接口作为属性
- 装饰(器)模式:抽象类实现了接口(强耦合),(可选择并放入了接口作为属性)
- 行为上
- 桥接模式:两个独立的维度
- 装饰(器)模式:组合关系(比如主成分,辅料)
3. 行为型模式(11)
- (13)策略模式 Strategy:https://blog.csdn.net/qq_41157876/article/details/111831925
- 策略接口Strategy 和 各个策略实现类(StrategyA,StrategyB...)
- 对外提供封装策略的Context类,把Strategy作为属性传入,构造器 Context(Strategy strategy)
- 调用时: Context context = new Context( StrategyA )
- (14)模板方法模式 Template Method:https://blog.csdn.net/qq_41157876/article/details/111833471
- 提供抽象类作为模板
- 子类只需继承抽象类,实现抽象方法,完成模板
- (15)观察者(发布/订阅)模式 Observer:https://blog.csdn.net/qq_41157876/article/details/111861499
- (16)迭代子模式 Iterator:
- (17)责任链模式 China of Responsibility:https://blog.csdn.net/qq_41157876/article/details/110437597
- (18)命令模式 Command:https://blog.csdn.net/qq_41157876/article/details/111879835
- 角色
- Receiver(接收者):真正执行命令的对象
- Command(抽象命令类),ConcreteCommand(具体命令类):拥有receiver属性
- Invoker(调用者):拥有concreteCommand属性
- Client(客户端):调用invoker的方法执行
- 封装了Command对象,实现了invoker和receiver的松耦合
- (19)备忘录模式 Memento:https://blog.csdn.net/qq_41157876/article/details/111880541
- 角色
- Memento:包含了要被恢复的对象的状态
- Originator:创建新的Memento;或者设置Memento中的状态
- CareTaker:记录Memento的历史状态
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
- (20)状态模式 State:https://blog.csdn.net/qq_41157876/article/details/111881484
- 角色
- State接口 和 State实现类(StartState,StopState...)
- Context类:暴露给外部使用
- (21)访问者模式 Visitor:
- (22)中介者模式 Mediator:https://blog.csdn.net/qq_41157876/article/details/111884375
- (23)解释器模式 Interpreter:
4. 设计模式六大原则
- 单一职责原则
- 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分
- 里氏替换原则
- 依赖倒转原则
- 这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体
- 写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互
- 接口隔离原则
- 每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分
- 即,使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好
- 迪米特法则
- 合成复用原则
- 合成/聚合 优于 继承