C# 开发人员最需要掌握的5种设计模式

设计模式在软件设计之初最需要考虑到的。一个好的设计模式,它可以提高代码的可维护性、代码的复用、灵活性和扩展性、可测试性。道传科技的抖音课程,后续会有详细的23种设计模式的代码讲解和使用案例。

本文中,我们讲了解道C#开发工程师必须了解的5种设计模式。无论你是初学者还是经验老道的工程师,熟练的使用这几种设计模式,都会提升你的开发和维护效率。

一、单例模式

1、基本介绍

    意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    主要解决:一个全局使用的类频繁地创建与销毁。

    何时使用:当您想控制实例数目,节省系统资源的时候。

    如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

    关键代码:构造函数是私有的。

2.优点:

      在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理首页页面缓存)。

      避免对资源的多重占用(比如写文件操作)。

3.缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

4.使用场景:

      要求生产唯一序列号。  

      WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

      创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等

图片

二、工厂模式

1、模式的实现要点(工厂模式)

Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。

Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。

2、模式的优点

(1)在工厂方法中,用户只需要知道所要产品的具体工厂,无须关心具体的创建过程,甚至不需要具体产品类的类名。

(2)在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。

3、 模式的缺点

(1)每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

4、 模式使用的场景

(1)一个类不知道它所需要的对象的类。在工厂方法模式中,我们不需要具体产品的类名,我们只需要知道创建它的具体工厂即可。

(2)一个类通过其子类来指定创建那个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。

(3)将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。

图片

三、观察者模式

1、模式使用要点

 观察者模式非常适用于事件驱动型系统。它允许一个对象(主体)在其状态发生变化时通知多个其他对象(观察者)。可以把它想象成社交媒体的通知——当一个用户发布更新内容时,所有订阅的人都会收到通知。

2、模式的优点

(1)观察者模式实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层,即观察者。

(2)观察者模式在被观察者和观察者之间建立了一个抽象的耦合,被观察者并不知道任何一个具体的观察者,只是保存着抽象观察者的列表,每个具体观察者都符合一个抽象观察者的接口。

(3)观察者模式支持广播通信。被观察者会向所有的注册过的观察者发出通知。

3、 模式的缺点

(1)如果一个被观察者有很多直接和间接的观察者时,将所有的观察者都通知到会花费很多时间。

(2)虽然观察者模式可以随时使观察者知道所观察的对象发送了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎样发生变化的。

(3)如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃,在使用观察者模式应特别注意这点。

图片

四、装饰器模式

1、模式使用要点

装饰器模式允许你在运行时动态地向一个对象添加行为,而无需改变该对象所属的类。想象一下你正在组装一个定制蛋糕——你先从一个基础(简单的蛋糕)开始,然后不断添加层次(装饰器),比如糖霜、糖粒和配料等。

2、模式的优点

(1)组合模式使得客户端代码可以一致地处理对象和对象容器,无需关心处理的是单个对象,还是组合的对象容器。

(2)将”客户代码与复杂的对象容器结构“解耦。

(3)可以更容易地往组合对象中加入新的构件。

3、 模式的缺点

(1)使得设计更加复杂。客户端需要花更多时间理清类之间的层次关系。(这个是几乎所有设计模式所面临的问题)。

4、模式使用的场景

(1)需要表示一个对象整体或部分的层次结构。

(2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

图片

五、策略模式

1、策略模式使用要点

策略略模式对于动态行为选择来说是一个变革性的模式。它定义了一系列算法,将每个算法都封装起来,并使其可以相互替换。你可以根据条件在运行时选择合适的策略。与其在你的代码中到处编写if-else或者switch-case语句,策略模式将每种行为都封装为一个对象。这会使代码更简洁、更灵活,更易于维护和扩展。

2、 模式的优点【重点!】

(1)策略类之间可以自由切换。由于策略类都实现同一个接口,所以使它们之间可以自由切换。

(2)易于扩展。增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码。

(3)避免使用多重条件选择语句,充分体现面向对象设计思想。

3、模式的缺点

(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

这点可以考虑使用IOC容器和依赖注入的方式来解决,关于IOC容器和依赖注入(Dependency Inject)的文章可以参考:IoC 容器和Dependency Injection 模式。

(2)策略模式会造成很多的策略类。

4、 模式使用的场景

(1)一个系统需要动态地在几种算法中选择一种的情况下。那么这些算法可以包装到一个个具体的算法类里面,并为这些具体的算法类提供一个统一的接口。

(2)如果一个对象有很多的行为,如果不使用合适的模式,这些行为就只好使用多重的if-else语句来实现,此时,可以使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句(if-else),并体现面向对象的思想。

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值