设计模式图解

1.  创建型模式
1.1  Factory模式
工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个雷的实例化延迟到其子类中。
Factory模式的两个最重要的功能:
1)定义创建对象的接口,封装了对象的创建;
2)使得具体化类的工作延迟到了子类中。

简单工厂:单纯只是封装了对象的创建
工厂模式封装了对象的创建,且将具体化类的工作延迟到子类中去


1.2  AbstactFactory模式
一个例子:要开发一款游为游戏设立等级,初级、中级、高级甚至有 BT级。假设也是过关的游戏,每个关卡都有一些怪物( monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。

AbstractFactory模式与Factory模式:
AbstractFactory模式:要创建一组(有多类)相关或者相互依赖的对象
而Factory模式是为一类对象提供创建接口或延迟对象的创建到子类中实现



1.3  Singleton模式


我们通过维护一个static的成员变量来记录这个唯一的对象实例。通过提供一个static的接口instance来获得这个唯一的实例。
Singleton不可以被实例化,因此我们将其构造函数声明为protected或者直接声明为private。
Singleton模式经常和Factory (AbstractFactory )模式在一起使用,因为系统中工厂对象一般来说只要一个。

1.4  Builder模式
目的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder模式要解决的是这样的问题:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。


Builder模式的关键是其中的Director对象并不直接返回对象,而是通过一步步(BuildPartA,BuildPartB,BuildPartC)来一步步进行对象的创建。当然这里Director可以提供一个默认的返回对象的接口(即返回通用的复杂对象的创建,即不指定或者特定唯一指定BuildPart中的参数)。

Builder模式和AbstractFactory模式:
Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。

1.5  Prototype模式
Prototype模式提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。


Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的实现语言相关,在C++中我们将通过拷贝构造函数实现之。

Prototype模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是: Builder模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory模式重在产生多个相互依赖类的对象,而 Prototype模式重在从自身复制自己创建新类。
 

2. 结构性模式
Decorator模式
装饰者模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。


装饰模式是为已有功能动态添加更多功能的一种方式。它把每个要装饰的功能房子单独的类中,并让这个类包装它所要装饰的对象。
装饰模式的优点可以把类中的装饰功能从类中搬出去除,这样可以简化原有的类,有效地把类的核心职责和装饰功能区分开来。而且可以去除相关类中重复的装饰逻辑。


Facade模式
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个借口使得这一子系统更加容易使用。



Proxy模式
代理模式,为其他对象提供一种代理以控制对这个对象的访问。



远程代理:为一个对象在不同地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
安全代理:用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
智能指引:当调用真实的对象时,代理处理另外一些事。


3. 行为模式
Template模式
当我们要完成在某一个细节层次一直的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤。


模板模式通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。


Strategy模式
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,特可以以相同的方式调用所有的算法,减少各种算法与使用算法类之间的耦合。


Strategy模式和Template 模式解决了类似的问题 Strategy模式和 Template模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。这两种方式各有优缺点:
1 ) 继承:
优点
1 )易于修改和扩展那些被复用的实现。
   缺点
1 )破坏了封装性,继承中父类的实现细节暴露给子类了;
2 )“白盒”复用,原因在 1 )中;
3 )当父类的实现更改时,其所有子类将不得不随之改变
4 )从父类继承而来的实现在运行期间不能改变(编译期间就已经确定了)。
2 ) 组合
优点
1 )“黑盒”复用,因为被包含对象的内部细节对外是不可见的; 2 )封装性好,原因为 1 );
3 )实现和抽象的依赖性很小(组合对象和被组合对象之间的依赖性小);
4 )可以在运行期间动态定义实现(通过一个指向相同类型的指针,典型的是抽象基类的指针)。
  缺点
                   1 )系统中对象过多。
从上面对比中我们可以看出,组合相比继承可以取得更好的效果,因此在面向对象的设计中的有一条很重要的原则就是:优先使用(对象)组合,而非(类)继承(Favor Composition Over Inheritance)。


Mediator模式
Mediator模式提供将对象间的交互和通讯封装在一个类中,各个对象间的通信不必显势去声明和引用,大大降低了系统的复杂性能(了解一个对象总比深入熟悉 n个对象要好)。另外 Mediator模式还带来了系统对象间的松耦合。


Mediator模式是一种很有用并且很常用的模式,它通过将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性。
Mediator还获得系统解耦的特性,通过 Mediator,各个 Colleague就不必维护各自通信的对象和通信协议,降低了系统的耦合性, Mediator和各个 Colleague就可以相互独立地修改了。


Observer模式
观察这模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值