设计模式的类型
总体来说总共有 23 种设计模式,这些模式可以分为三大类:
- 创建型模式(5种):
- 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
- 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。
- 结构型模式(7种):
- 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 用于描述如何将类或对象按某种布局组成更多的结构。
- 行为型模式(11种):
- 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
- 用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。
- J2EE 模式:
- MVC 模式、业务代表模式、组合实体模式、数据访问对象模式、前端控制器模式、拦截过滤器模式、服务定位器模式、传输对象模式。
- 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。
常用的设计模式
单例模式、(抽象)工厂模式、代理模式 、 观察者模式 、 装饰器设计模式。
1、单例模式Singleton
简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()方法来获取它们的实例。
- 特点
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
- 目的
- 主要解决:一个全局使用的类频繁地创建与销毁。
- 何时使用:当您想控制实例数目,节省系统资源的时候。
- 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
- 关键代码:构造函数是私有的。
- 优点
- 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。
- 缺点
- 没有抽象层,不能扩展
- 职责过重,违背了单一性原则
- 使用场景:
- 要求生产唯一序列号。
- 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
- WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
- 实例,单例模式的实现有多种方式,如下所示:
懒汉式(饱汉式),线程不安全,不支持多线程,用到的时候才创建对象(Lazy 初始化,即延迟加载,有利于提升性能。)。懒汉式,加锁synchronized实现线程安全和支持多线程,但是效率低下。
- 饿汉式(较常用),多线程安全。没有加锁,执行效率会提高。类加载时就初始化,浪费内存。
- 双检锁/双重校验锁(DCL,即 double-checked locking),JDK1.5 起,采用双锁机制,安全且在多线程情况下能保持高性能,Lazy 初始化。
- 登记式/静态内部类,多线程安全,Lazy 初始化,Singleton 类被装载了,instance 不一定被初始化,只有被显示调用才会实例化instance。
- 枚举:JDK1.5 起,多线程安全,类加载时就初始化
2、工厂模式Factory
- 特点
- 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
- 目的
- 主要解决:主要解决接口选择的问题。
- 关键代码:创建过程在其子类执行。
- 优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
- 缺点
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
- 使用场景
- 日志记录器
- 数据库访问
- 作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
- 实例,大体分为工厂模式和抽象工厂模式
- 普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
- 多个工厂方法模式:是对普通工厂方法模式的改进,在普通工厂方法模式中,职权过重,并且如果传递的字符串出错或判断出问题,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
改动下MyCarsFactory类就行:还有种是直接把工厂也给拆开,然后顶层抽象一个工厂接口。
- 静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
- 抽象工厂模式: 是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
基于上边Car添加Color类及子类,抽象工厂类和Car及Color的工厂类:
- 按照网上说法普通工厂模式处理产品等级比较好,而抽象工厂处理产品族比较好。比如工厂生产车,车分为小型车,大型车,这是产品等级,产品族是这个工厂不止生产车,还生产飞机、船。
- 这两种模式扩展都需要修改代码,产品族难扩展,产品等级易扩展。
3、代理模式Proxy
- 特点
- 一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
- 通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
- 目的
- 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
- 如何解决:增加中间层。
- 优点
- 职责清晰
- 高扩展性
- 缺点
- 有些类型的代理模式可能会造成请求的处理速度变慢
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
- 使用场景
- 远程代理
- 虚拟代理
- Copy-on-Write 代理
- 保护(Protect or Access)代理
- 实例
4、其他模式待补充
https://www.runoob.com/design-pattern/design-pattern-intro.html
https://blog.csdn.net/sugar_no1/article/details/88317950