前言
最近在工作闲暇之余阅读了《设计模式之禅》这本书,对其中一些知识点做简单的归纳整理,以资充实技能之用。坦白讲,设计模式在很多人看来是比较虚的东西。工作几年但不知道甚至尚未意识到使用设计模式的大有人在,但作为一个合格的开发者,了解并学习设计模式是很有必要的。
什么是设计模式?
设计模式是什么?它是一套理论,由软件界的先辈们(The Gang of Four:包括Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)总结出的一套可以反复使用的经验,它可以提高代码的可重用性,增强系统的可维护性,以及解决一系列的复杂问题。
设计模式不是工具,它是软件开发的哲学,它能指导你如何去设计一个优秀的架构、编写一段健壮的代码、解决一个复杂的需求。
一、单例模式
一提到设计模式,很多人脑海中第一反应就是单例模式。那么,什么是单例模式呢?
Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中自己使用new Singleton())。
其类图为:
单例模式的优点:
减少了内存开支
减少了系统的性能开销
可以避免对系统的多重占用
可以在系统设置全局的访问点
单例模式的缺点:
单例模式一般没有接口,扩展很困难
单例模式对测试是不利的
单例模式与单一职责原则有冲突
单例模式的扩展:
采用有上限的多例模式,我们可以在设计时决定在内存中有多少个实例,方便系统进行扩展,修正单例可能存在的性能问题,提供系统的响应速度。例如读取文件,我们可以在系统启动时完成初始化工作,在内存中启动固定数量的reader实例,然后在需要读取文件时就可以快速响应。
二、工厂方法模式
工厂方法模式使用的频率非常高,在我们日常的开发中总能见到它的身影。
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
其类图为:
工厂方法模式的优点:
良好的封装性
拓展性非常优秀
屏蔽产品类
是典型的解耦框架
工厂方法模式的使用场景:
工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度。
需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。
工厂方法模式可以用在异构项目中
可以使用在测试驱动开发的框架下。
三、抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种比较常用的模式。
其定义为:
为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
其类图为:
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
抽象工厂模式的优点:
良好的封装性
产品族内的约束非公开状态
抽象工厂模式的使用场景:
抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。什么意思呢?例如一个文本编辑器和一个图片处理器,都是软件实体,但是*nix下的文本编辑器和Windows下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也有类似情况。也就是具有了共同的约束条件:操作系统类型。于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。