一共有23类设计模式,这里记录比较常用的几种适配器模式。
[创建型]设计模式
1.1 工厂模式
对于工厂类来说,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成。
- 简单工厂就是一个函数或者类,根据输入参数的不同,其内部创建了不同的产品。
- 工厂方法来看,比简单工厂更加复杂,就是有不同的工厂,不同的工厂根据输入的参数返回固定类型的产品,一般来说就是一个工厂对应一类产品。
- 抽象工厂方法来看,比(2)的应用场景更加复杂,可以有一个工厂对应多种产品的现象。
总结来看:工厂方法都是把产品的创建封装起来,用户只需要考虑输入参数,就可以得到不同的产品,这要就不用暴露代码内部的接口,使得开发更加简单。
(1)简单工厂模式
(2)工厂方法模式
(3)抽象工厂模式
1.2 单例设计模式
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
缺点:
- 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
- 单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。
- 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致对象状态的丢失。
饿汉式
参考自参考资料[3],实现思路:构造方法私有化/或者保护,外部无法new对象,同时提供一个GetInstance方法,在运行时就全局创建。
缺点是:程序启动的时候,对象就被创建,消耗资源。
懒汉式(线程安全/不安全)
参考自参考资料[4],实现思路:构造方法私有化/保护,同时有一个私有指针,提供GetInstance方法,并且由GetInstance方法new对象,new对象之前,先判断私有指针是不是NULL。
双重检查锁技术
双重检查锁定在懒汉式的基础上做了进一步的优化,既保证了懒加载,又保证了线程安全,同时减少了锁的粒度,提高了性能。
[结构型]设计模式
2.1 适配器模式
适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。
直观的理解,适配器可以把多个接口给封装成同一个,然后在内部进行逻辑选择。(同样也是不需要暴露内部的接口,使得开发更加简单)