常用5种设计模式介绍


1单例模式

在某些情况下,有些对象只需要一个就可以了,即每个类只需要一个实例。例如,一台计算机上的可以连接多台打印机,但是该计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中只有一个打印程序的实例。

单例模式(单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”

的需求时才可使用。

:全局变量和单例模式的区分

全局变量是对一个对象的静态引用,全局变量确实可以提供单例模式实现的全局访问这个功能,但是它并不能保证应用程序中只有一个实例,同时在编码规范中,也应该明确指出应该要少用全局变量,因为过多地使用全局变量,会造成代码难读,还有就是全局变量也不能实现继承(虽然单例模式在继承上也不能很好地处理,但是还是可以实现继承的)。而单例模式,其在类中保存了它的唯一实例,这个类可以保证只能创建一个实例,同时它还提供了一个访问该唯一实例的全局访问点。

使用单例模式,一般需要注意单例模式是用来实现在整个程序中只有一个实例的。单例类的构造函数必须为私有,同时单例类必须提供一个全局访问点(使用static 或友元)。

2工厂模式

工厂模式专门负责实例化有大量公共接口的类。

优点:工厂模式可以动态地去决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类。客户类和工厂类是分开的。消费者无论什么时候需要某种产品,需要做的只是向工厂提出请求即可。消费者无需修改就可以接纳新产品。

缺点:当产品修改时,工厂类也要做相应的修改。

 

工厂模式包含以下3中形态:

1)简单工厂(Simple Factory)模式:简单工厂模式的工厂类是根据提供给它的参数,返回的是几个可能产品中的一个类的实例,通常情况下它返回的类都有一个公共的父类和公共的方法。

2)工厂方法(Factory Method)模式:工厂方法模式是类的创建模式,其用意是定义一个用于创建产品对象的工厂的接口,而将实际创建工作推迟到工厂接口的子类中。它属于简单工厂模式的进一步抽象和推广。多态的使用,使得工厂方法模式保持了简单工厂模式的优点,克服了它的缺点。

3)抽象工厂(Abstract Factory)模式:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时使用的一种工厂模式,抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则(Liskov替换原则),任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

3适配器模式

概念:适配器模式也被称为变压器模式,它是把一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够一起工作。适配器类可以根据所传递的参数返回一个合适的实例给客户端。

用途:适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。

形式:适配器模式有对象适配器和类适配器2种形式的实现结构。类适配器采用“多继承”的实现方式,会引起程序的高耦合,不推荐使用;而对象适配器采用“对象组合”的方式耦合度低,应用范围更广。

事例:现在系统里已经实现了点、线、正方形,而现在客户要求实现一个圆形,一般的做法是建立一个Circle类来继承以后的Shape类,然后去实现对应的displayfillundisplay方法。此时如果发现项目组其他人已经实现了一个画圆的类,但是他的方法名却与自己的不一样:displayhhfillhhundisplayhh,我们不能直接使用这个类,因为那样无法保证多态。而有的时候也不能要求组件类改写方法名,此时可以采用适配器模式。

4享元模式

享元模式以共享的方式高效地支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。将可以共享和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度地降低内存中对象的数量。

内蕴状态:存储在享元内部,不会随环境的改变而有所不同。

外蕴状态:随着环境的改变而改变的,外蕴状态不能影响内蕴状态,他们是相互独立的。

 

5观察者模式

概念:观察者模式(发布/订阅模式)提供了避免组件之间紧密耦合的另一种方法,它将观察者和被观察者的对象分离开。在该模式中,一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关,结果是对象可以相互对话,而不必了解原因。JavaC#的事件处理机制就是采用的此种设计模式。

事例:用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将它做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

你可能感兴趣的:(设计模式)