截至上一篇文章,已经介绍了8个常用的设计模式。四人帮(Gang of Four)总结的第一版设计模式中,一共有23个模式,后来又陆续总结了些,应该有三十多个。个人实际工作中常用到11个设计模式(前文介绍的8个以及本文将介绍的3个),我认为这也是最常用的模式。本文将再介绍3个常用的设计模式:Singleton(单体)模式、Factory Method(工厂方法)模式和Prototype(原型)模式。在下一篇将介绍部分设计模式的具体应用。
一. Singleton模式
1. 目标:确保一个类在运行时,有且仅有一个实例,并提供一个访问它的唯一入口。
2. 问题:在一些业务场景的要求下或者其他技术上的考量,保证类只有一个实例非常重要
3. 解决方案:屏蔽类的公共构造函数,只提供访问该类实例的全局入口,在该入口中只会实例化一次。
4. 参与者和协作者:Singleton负责创建自己的唯一实例,并提供调用方法,如GetInstance()。
5. 效果:Singleton模式减少了对象的内存占用,并且降低了对象的创建开销。对于实现Singleton模式,要求该类是线程安全(Thread safe)的。当并发很高时,Singleton模式可能会存在性能问题。但是,如果类的行为不依赖于类的特定状态,即不存在竞争资源,性能问题几乎可以忽略。
6. 实现:类中提供一个静态方法GetInstance()获取唯一实例,类的构造函数访问权限设为protected,当然如果你不想控制类的运行时实例数目就不必设此限制。代码请参考07. 设计模式应用案例(下)。UML图如下:
二. Factory Method模式
1. 目标:定义一个创建对象的接口,由子类决定创建哪个对象。将实例化推迟到继承接口的子类进行。
2. 问题:一个类需要实例化另一个类的派生类之一,但在当前上下文环境中不知道是那一个派生类,需要在该类自身的派生类中决定。
3. 解决方案:由主类的派生类决定实例化策略。在语言层面,通过多态和覆盖(override)实现派生类的特殊行为。
4. 参与者和协作者:Product是工厂方法所创建的对象类型的接口或者是服从Product接口约束的泛型。Creator是定义工厂方法的接口。
5. 效果:客户将需要派生Creator,以创建一个特定的ConcreteProduct对象。
6. 实现:在抽象类中使用一个抽象方法,派生类必须实现该方法,编写实例化具体类的代码。代码请参考07. 设计模式应用案例(下)。UML图如下:
三. Prototype模式
1. 目标:用原型对象决定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2. 问题:主体功能已经确定,部分功能的具体行为需要在运行时,由包含的Prototype的派生类决定。
3. 解决方案:由主类持有原型类的引用,调用统一接口Clone(),从而根据实现在运行时返回具体类型。
4. 参与者和协作者:Client请求一个Prototype类,Prototype通过Clone()方法返回具体的对象。
5. 效果:实现延迟创建具体对象,Client只需关心Prototype类型,而无需关心具体的派生类,根据运行时环境Clone具体派生类。
6. 实现:将Prototype以构造函数参数形式传入,在Client Operation中调用Prototype Clone接口。Clone方法的具体行为由Prototype的派生类在运行时决定。代码请参考07. 设计模式应用案例(下)。UML图如下: