重新领略设计模式之美

在这里插入图片描述


本文主要讲解如何设计模式的一些优缺点和适用场景以及一些概念信息

首先我们看一下设计模式的总览

在这里插入图片描述

接下来我们开始逐个分析每个设计模式的优缺点和概念

单例模式

概念:

保证一个类仅有一个实例,并提供一个访问它的全局访问

优点:

提供了对唯一实例的受控访问

允许可变数目的实例

避免对共享资源的多重占用

缺点:

扩展麻烦

单例类的职责过重,在一定程度上违背了“单一职责原则”

适用场景

需要频繁实例化然后销毁的对象

有状态的工具类对象。

频繁访问数据库或文件的对象。

工厂模式

概念:
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式是一个类的实例化延迟到子类
优点:

将职责进行分类

缺点:

扩展性差

不支持不同的产品需要不同额外参数的时候

适用场景

消费者不关心它所要创建对象的类(产品类)的时候。

消费者知道它所要创建对象的类(产品类),但不关心如何创建的时候

抽象工厂模式

概念:

提供一个创造一系列或相对依赖关系的接口,而无需制定它们具体的类

优点

在类的内部解决管理多个产品的问题

缺点

太臃肿,管理的类太多

产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改

适用场景:

一个系统要独立于它的产品的创建、组合和表示时

一个系统要由多个产品系列中的一个来配置时

需要强调一系列相关的产品对象的设计以便进行联合使用时

提供一个产品类库,而只想显示它们的接口而不是实现时

建造者模式

概念:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示

优点

将过程隐藏,高内聚的前提下降低了耦合度

缺点

缺少大批量的相同的建造过程

适用场景

就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束

原型模式

优点

复制结构和数据/原型模式是在内存中二进制流的拷贝,要比直接new 一个对象性能好很多

缺点

它的优点也是缺点,直接在内存汇总拷贝,构造函数是不会执行的

适用场景

需要一个类的大量对象的时候

如果一个对象的初始化需要很多其他对象的数据准备或其他资源的繁琐计算

适配器模式

概念
将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能在一起工作的接口可以一起工作

优点

将目标类和适配者类解耦

增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性/灵活性和扩展性都非常好,符合开闭原则

缺点

由于C#不支持多重继承,所以最多只能适配一个适配者类,而且目标类必须是抽象类

采用了类和接口的“双继承”实现方式,带来了不良的高耦合。

适用场景

统一多个类的接口设计

兼容老版本接口

适配不同格式的数据

桥接模式

概念
将抽象部分和实现部分分开,使他们都可以独立的变化

优点

减少耦合,用聚合来代替继承

缺点

增加系统的理解与设计难度

适用场景

系统可能有多角度分类,每一种分类都有可能变化。

组合模式

概念
将对象组合成树形结构以表示'部分-整体'的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性
优点

一致地使用组合结构和单个对象

缺点

建含有特定对象的类难以实现

适用场景

树形结构,需求中是体现部分与整体层次的结构时,并且希望用户可以忽略组合对象与单个对象的不同,统一地使用结构中的所有对象时,考虑用组合模式

装饰模式

概念:
动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活
优点

简化原有的类,有效的解耦,

缺点

把功能拆分太细,容易出错

适用场景

当系统需要新功能的时候,新加的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要

外观模式

概念

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

优点

降低耦合度

缺点

降低了灵活性

使用场景

设计初期,应该有意识的将不同的层分离

开发期,子系统往往因为不断地重构演化而变得越来越复杂

维护期,系统难以维护和扩展。

享元模式

概念
为运用共享技术有效地支持大量细粒度的对象
优点

节约存储空间

缺点

需要维护一个记录了系统已有的所有享元的列表,这本身需要耗费资源,享元模式使得系统更加复杂。

适用场景

一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销

代理模式

概念:
为其他对象提供一种代理以控制对这个对象的访问

优点

降低耦合度,扩展性好

缺点

因为有中间层的存在,导致处理速度变慢

适用场景

用来控制真实对象访问时的权限

需要对当前类做一些前置或者后置操作(autofuc)

观察者模式

概念
定义对象间的一种一对多的依赖关系,当一个对象的状态正在发生改变的时候,所有依赖于它的对象都得到通知并自动改变

优点

可以实现表示层和数据逻辑层的分离

在观察目标和观察者之间建立一个抽象的耦合

支持广播通信且符合开闭原则

缺点

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjxjj.html