二十三种设计模式


耦合度排名:

  • 1、继承
  • 2、聚合(属性)
  • 3、方法参数或者返回值

工厂模式、责任链、代理、策略、观者者

01 单例模式(SingleTon)

一共有八种方式

  • 饿汉式:类的实例、构造方法用private修饰,类加载到内存中时,就创建类的实例;简单实用,线程安全
  • 饿汉式,使用static代码块创建对象
  • 懒汉式:根据需要进行创建,但是多线程访问可能出现问题
    在这里插入图片描述
  • getInstance上加锁:给getInstance增加synchronized,处理了线程不安全问题,坏处是每次调用都要判断是否有锁,效率变低;
  • getInstance方法体枷锁,不可行
  • 双重检查:在五的基础上增加了实例为null校验
    在这里插入图片描述
  • 静态内部类:在静态内部类中创建外部类的实例。类只会加载一次,jvm保证单例。
  • 枚举类(java创始人之一,Effective java写了以下方法):不仅可以解决线程同步,还可以防止反序列化。
    在这里插入图片描述

02 策略模式(strategy)

几乎所有的设计模式都是多态,多态是设计模式的核心思想。理解多态可以更加了解面向对象的优势。
将实现方法部分抽离出来,写成一种设计模式,实现设计思想的解耦合。

03 工厂模式(Factory)

任何可以产生对象的方法或类,都可以称之为工厂
单例也是一种工厂
为什莫有了new之后,还要有工厂?

  • 灵活控制生产过程
  • 权限、修饰、日志。。。
    在使用工厂模式时,一般形容词对象用接口,名词类用抽象类;
    动态添加产品族方便;但是增加了更多的类;事先没有设计抽象工厂模式,重构时非常麻烦;

04 调停者(Mediator)

在这里插入图片描述

05 门面(Facade)

坦克大战中各种元素,敌我、子弹、墙、地雷之间关系互相碰撞,随着添加进来,逻辑关系愈加复杂,因此通过一个接口封装(门面)
门面和调停者可以同时使用;

06 装饰器模式(Decorator)

07 责任链模式

责任链入门url
在坦克大战项目中,碰撞检测引入责任链设计模式,游戏各种对象两两通过碰撞检测的LinkedList,完成碰撞检测。

08 观察者模式(Observer)

观察者模式中一般包含三个元素:source, observer(listener),event。
source触发event事件,event作为参数传入observer中发生后续处理。

  • event一般内部包含source
  • observer一般封装一个接口,将动作函数封装,具体的监听者实现接口实现具体的方法

09 组合(Composite)

树状结构专用模式(不难)

10 享元模式(Flyweight)

不简单、共享元数据
常见例子:线程池,连接池
常见的面试题中,新建几个同样字符串的值,是否相等

String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
s1 == s2    //true
s1 == s3    // false
s1 == s3.intern()   // true

11 代理模式(proxy)

具体代码跳转
AOP为Aspect Oriented Programming

  1. Proxy动态代理
    jdk反射生成代理必须面向接口,这是Proxy的内部实现决定的;
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

上述Proxy中实现动态代理是通过asm的jar包实现,asm包可以直接对class文件进行修改**(字节码级别改动)。也可以对final class进行修改**
2. instrument(jdk自带)
在类加载到内存的过程中可以使用该方法,直接对类文件进行修改,比较复杂,另外弊端就是必须知道class文件中16进制字节码的含义。底层实现的是asm
3. CGLIB
cglib实现动态代理不需要接口,其底层也实现的是asm,原理是实现了被代理对象的子类,因此对于final class无能为力

12 迭代器模式(iterator)

【物理】实际存储中主要使用两种数据结构:1、连续存储,数据;2、节点指向下一个节点,集合list
逻辑结构:hashset、二叉树等等
关于泛型:
对于传入数据类型的字母使用

  • 容器中Element E
  • Type T
  • Key K
  • Value V

(专用模式)容器和容器遍历

构建动态扩展的容器

  • List.add()
    数组的实现
    链表的实现
    数组和链表
  • 插入(链表快)
  • 删除(链表快)
  • 随机访问(数组快)
  • 扩展(链表快)

13 访问者模式(Visitor)

在结构不变的情况下动态改变对于内部元素的动作

了解ASM

idea中下载jclasslib Bytecode viewer,对class文件进行字节码查看

14 构造器模式(build)

分离复杂对象的构建和表示(更加灵活,可以对构建对象的参数进行灵活分组;set只能单独设置一个参数)
同样的构建过程可以构建不同的对象
无需记忆,自然使用

15 转换器模式/适配器模式(Adapter/Wrapper)

常见案例

电压转接头
java.io
jdbc-odbc bridge(不是桥接模式)[sqlserver对外暴露接口ODBC,java只能连接jdbc,因此需要一个驱动]
ASM transformer
在这里插入图片描述
常见的Adapter类反而不是Adapter

  • WindowAdapter
  • KeyAdapter
    在这里插入图片描述
    此处如果实现WindowListener接口,那就要重写里面所有的方法。我们可能只关注其中的某一个,因此常用的是WinowAdapter只关注需要重写的方法即可
    在这里插入图片描述

16 桥接模式(Bridge)

双维度扩展 [不常使用]

17 行为模式/事务模式(command)

封装命令
结合cor实现undo

18 原型模式(Prototype)

java中的原型模式

自带该模式
实现原型模式需要实现标记型接口Cloneable
一般蛔虫给clone() 方法。【如果只是重写clone()方法,二妹实现接口,调用时会报异常】
一般用于一个对象的属性已经确定,需要产生很多相同对象的时候
需要区分深克隆和浅克隆

19 备忘录模式(Memento)

与序列化配合使用,实现小游戏的存盘与读档
使用

记录快照(瞬时状态)
存盘
在这里插入图片描述

网络传输一般使用是google的ProtoBuf, 原因是java的序列化了一大堆类的属性的内容,序列化的结果体谅比较大;
protobuf序列化的体量为1,java的序列化体量为2~3

20 模板方法(TemplateMethod)

钩子函数

21 状态模式(state)

22 解释器(Intepreter)

pythod解释器(解释一种语言)

23

总结:

创建型模式:

  1. Abstract Factory
  2. Builder
  3. Factory Method
  4. Prototype
  5. Singleton

结构型模式:

  1. Aadapter
  2. Bridge
  3. Composite
  4. Decorator
  5. Facade
  6. Flyweight
  7. Proxy

行为型模式:

  1. Chain of Responsibility
  2. Command
  3. Interperter
  4. Iterator
  5. Mediator
  6. Memento
  7. Observer
  8. State
  9. Strategy
  10. Template Method
  11. Visitor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值