设计模式总结
参考:http://www.runoob.com/design-pattern/flyweight-pattern.html
1. 创建型模式:5 种
(1) 普通工厂模式:
Shape 接口、circle 实现类、shapeFactory 工厂类
应用场景:数据库连接、日志记录
(2) 抽象工厂模式
Shape 接口、circle 实现类、color 接口、red 实现类、
AbstractFactory 抽象工厂类/接口、ShapeFactory 继承/实现抽象工厂、ColorFactory
继承/实现抽象工厂、FactoryProducer 工厂生产器类
应用场景:产品组(如时尚装、商务装)
(3) 单例模式:构造函数是私有的
饿汉式:在 classloader 类加载时实例化好了,不存在多线程同步问题,不用加
锁,效率高,但是浪费内存。
懒汉式:synchronized 加锁
双检锁式:volatile synchronized 加锁
静态内部类:内部类实例化,初始化时不加载内部类,调用方法时加载内部类。
枚举:自动实现序列化
常用模式:饿汉式,特殊情况的考虑其他模式。
(4) 建造者模式:builder
场景:去肯德基点餐,可以单点,也可以点套餐,点餐就是一个建造订单的过
程
(5) 原型模式:property,用于创建重复对象,一般和工厂模式结合使用。
应用场景:细胞分裂、克隆
对象实现 cloneable 接口
缓存对象(hashMap)
从缓存对象中获取对象的克隆
2. 结构型模式:7 种
(1) 适配器模式:Adapter
Mp3
Mp4、Mp5
被适配者和适配者没有层次关系,比如将 110 伏电压适配成 220 伏电压,他们
是一对一关系
(2) 桥接模式:bridge
创建桥接口实现,创建抽象类和具体功能实现,抽象类中放入桥。
将类的功能层次结构和实现层次结构相分离,使二者能够独立地变化,并在两
者之间搭建桥梁,实现桥接
定义一个桥接口,使其与一方绑定,这一方的扩展全部使用实现桥接口的方式。
定义一个抽象类,来表示另一方,在这个抽象类内部要引入桥接口,而这一方
的扩展全部使用继承该抽象类的方式。
其实我们可以发现桥接模式应对的场景有方向性的,桥绑定的一方都是被
调用者,属于被动方,抽象方属于主动方。
应用场景:JDBC 实现,接口内部是对接口的多个实现来具体连接哪个数据库(被
动方桥绑定数据库),对外提供一个统一的接口调用(主动方调用)
(3) 组合模式
(4) 装饰器模式
被装饰者和装饰者有层次关系,比如将字节流包装成字符流,一对一关系。
(5) 外观模式
(6) 享元模式
(7) 代理模式
两种方式:1.JDK,基于接口代理 2.CGLIB,基于类的实现
1.JDK:Proxy.newInstance(…)创建代理
3. 行为型模式:12 种
(1) 观察者模式:
被观察者接口或主题(Subject),接口实现:添加观察者、删除观察者、通知
观察者接口(observer),接口实现:变化更新自己
被观察者:主题/发布/发送邮件
观察者:订阅/接收邮件
(2) 策略模式
(3) 模板方法模式
(4) 迭代子模式
(5) 责任链模式
Chain:filter 多个过滤器处理一个事件,每个过滤器只处理自己的职责,过滤器对
象一个链一个,形成链的结构。
filter1.nextFilter(filter2);
filter2.nextFilter(filter3);
filter1—>filter2—> filter3
应用场景:1. js 冒泡事件 2.tomcat 的 encode 处理 3.servlet 的 filter
(6) 命令模式
(7) 备忘录模式
(8) 状态模式
(9) 访问者模式
(10) 中介者模式
(11) 解释器模式