设计模式
- 01 单例模式(SingleTon)
- 02 策略模式(strategy)
- 03 工厂模式(Factory)
- 04 调停者(Mediator)
- 05 门面(Facade)
- 06 装饰器模式(Decorator)
- 07 责任链模式
- 08 观察者模式(Observer)
- 09 组合(Composite)
- 10 享元模式(Flyweight)
- 11 代理模式(proxy)
- 12 迭代器模式(iterator)
- 13 访问者模式(Visitor)
- 了解ASM
- 14 构造器模式(build)
- 15 转换器模式/适配器模式(Adapter/Wrapper)
- 16 桥接模式(Bridge)
- 17 行为模式/事务模式(command)
- 18 原型模式(Prototype)
- 19 备忘录模式(Memento)
- 20 模板方法(TemplateMethod)
- 21 状态模式(state)
- 22 解释器(Intepreter)
- 23
- 总结:
耦合度排名:
- 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
- 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
总结:
创建型模式:
- Abstract Factory
- Builder
- Factory Method
- Prototype
- Singleton
结构型模式:
- Aadapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
行为型模式:
- Chain of Responsibility
- Command
- Interperter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor


3万+

被折叠的 条评论
为什么被折叠?



