一、引言:
在前面我们学习了C#设计模式中的前十个模式——单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、适配器模式、桥接模式、装饰者模式、组合模式。在继续学习后面的设计模式之前,把前面学习过的设计模式整理归纳复习一遍是很有必要的。下面让我们来复习一下这十个设计模式的一些基础概念。
二、各设计模式:
1.单例模式:
1.1、定义:同一时间内只允许一个实例进行操作,确保一个类只有一个实例,并提供一个访问它的全局访问点。
1.2、实现方法:
2.简单工厂模式:
2.1、定义:由一个工厂对象决定创建出哪一种产品类的实例(难以扩展,一旦添加新产品就不得不修改简单工厂方法)。
2.2、优缺点:
2.2.1、优点:
2.2.2、缺点:
3.工厂方法模式:
3.1、定义:把具体产品的创建推迟到子类中,工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样就可以允许系统不修改工厂类逻辑的情况下来添加新产品,克服了简单工厂模式中缺点。
3.2、成员角色:
4.抽象工厂模式:
4.1、定义:抽象工厂模式提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类,抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么。
4.2、使用前提:
4.3、优缺点:
4.3.1、优点:将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展。
4.3.2、缺点:很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了开发封闭原则。
5.建造者模式:
5.1、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,使得建造代码与表示代码的分离,可以使客户端不必知道产品内部组成的细节,从而降低了客户端与具体产品之间的耦合度。建造者模式的本质是使组装过程和创建具体产品解耦。
5.2、实现要点:
6.原型模式:
6.1、定义:原型模式用一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的方法来创建出更多的同类型对象。
6.2、使用背景:当创建一个类的实例的过程很复杂,并且我们需要创建多个这样类的实例时,如果我们用new去创建这样的类实例,会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配了多个一样的类实例对象。因为每个类实例都是相同的,当我们需要多个相同的类实例时,没必要每次都使用new去创建相同的类实例对象,我们只需创建一个类实例对象,如果后面需要更多这样的实例,可以通过对原来对象拷贝一份来完成创建,这样在内存中不需要创建多个相同的类实例,从而减少内存的消耗和达到类实例的复用。
6.3、优缺点:
6.3.1、优点:
6.3.2、缺点:
7.适配器模式:
7.1、定义:适配器模式将“将现存的对象”在新的环境中进行调用,使得新环境中不需要去重复实现已经存在了的实现而很好地把现有对象(指原来环境中的现有对象)加入到新环境来使用。适配器模式有类的适配器模式和对象的适配器模式两种形式。
7.2、实现思维:在适配器模式中,适配器可以是抽象类,并适配器模式的实现是非常灵活的,我们完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,适配器类可以根据参数参数可以返回一个合适的实例给客户端。把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
7.3、使用前提:
8.桥接模式:
8.1、定义:桥接模式即将抽象部分与实现部分脱耦,实现抽象化与实现化的解耦,使它们相互独立互不影响到对方,使它们可以独立变化。
8.2、使用前提:
8.3、优缺点:
8.3.1、优点:
8.3.2、缺点:
9.装饰者模式:
9.1、定义:以对客户透明的方式动态地给一个对象添加额外的职责,采用对象组合而非继承的方式实现了再运行时动态地扩展对象功能的能力,相比生成子类可以更灵活地增加功能,而且可以根据需要扩展多个功能,避免了单独使用继承带来的灵活性差和多子类衍生问题。
9.2、出现背景:在软件开发中,我们经常想要对一类对象添加不同的功能,如果此时利用继承来实现的话,就需要定义无数的类,这样就会导致 ”子类爆炸“问题,为了解决这个问题,装饰者模式出现了。
9.3、成员角色:
9.4、使用前提:
9.5、优缺点:
9.5.1、优点:
9.5.2、缺点:
10.组合模式:
10.1、定义:组合模式简单对象和复合对象必须实现相同的接口,解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合。
10.2、出现背景:在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,由于简单对象和复合对象在功能上区别,导致在操作过程中必须区分简单对象和复合对象,这样就会导致客户调用带来不必要的麻烦,然而作为客户,它们希望能够始终一致地对待简单对象和复合对象,然而组合模式就是解决这样的问题。
10.3、使用前提:
10.4、实现模式:
10.5、成员角色:
10.6、优缺点:
10.6.1、优点:
10.6.2、缺点:
原文:https://www.cnblogs.com/jiechou/p/9130801.html