设计模式复习(1)_第1页
设计模式复习(1)_第2页
设计模式复习(1)_第3页
设计模式复习(1)_第4页
设计模式复习(1)_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、常常 文文 萃萃一、参考书目一、参考书目设计模式设计模式(Design Pattern)(Design Pattern)描述了在面向对象软件描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方设计过程中针对特定问题的简洁而优雅的解决方案,案,是是一套被反复使用一套被反复使用的的代码设计经验的总结。使代码设计经验的总结。使用设计模式用设计模式是为了可重用代码、让代码更容易被他人理是为了可重用代码、让代码更容易被他人理解和保解和保证代证代码可靠性。码可靠性。1.1.根据根据目的目的可分为创建型,结构型和行为型三种:可分为创建型,结构型和行为型三种:创建型创建型模式主要用于创建对象。模式主

2、要用于创建对象。结构型结构型模式主要用于处理类或对象的组合。模式主要用于处理类或对象的组合。行为型行为型模式主要用于描述对类或对象怎样交互和怎样模式主要用于描述对类或对象怎样交互和怎样分配职责。分配职责。2.2.根据根据范围范围,可分为类模式和对象模式两种:,可分为类模式和对象模式两种:类模式类模式处理类和子类之间的关系,这些关系通过继承处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是属于静态的。建立,在编译时刻就被确定下来,是属于静态的。 对象模式对象模式处理对象间的关系,这些关系在运行时刻变处理对象间的关系,这些关系在运行时刻变化,更具动态性。化,更具动态性。 范围

3、范围目的目的创建型模式创建型模式结构型模式结构型模式行为型模式行为型模式类模式类模式工厂方法模式工厂方法模式(类)适配器模式(类)适配器模式解释器模式解释器模式模板方法模式模板方法模式对象模式对象模式抽象工厂模式抽象工厂模式建造者模式建造者模式原型模式原型模式单例模式单例模式(对象)适配器模式(对象)适配器模式桥接模式桥接模式组合模式组合模式装饰模式装饰模式外观模式外观模式享元模式享元模式代理模式代理模式职责链模式职责链模式命令模式命令模式迭代器模式迭代器模式中介者模式中介者模式备忘录模式备忘录模式观察者模式观察者模式状态模式状态模式策略模式策略模式访问者模式访问者模式设计原则名称设计原则名称

4、设计原则简介设计原则简介重要性重要性单一职责原则单一职责原则(Single Responsibility Principle, SRP)类的职责要单一,不能将太多的职责放在一个类中类的职责要单一,不能将太多的职责放在一个类中开闭原则开闭原则(Open-Closed Principle, OCP)软件实体对扩展是开放的,但对修改是关闭的,即在不修软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能改一个软件实体的基础上去扩展其功能里氏代换原则里氏代换原则(Liskov Substitution Principle, LSP)在软件系统中,一个可以接受基类对象的地方

5、必然可以接在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象受一个子类对象依赖倒转原则依赖倒转原则(Dependency Inversion Principle, DIP)要针对抽象层编程,而不要针对具体类编程要针对抽象层编程,而不要针对具体类编程接口隔离原则接口隔离原则(Interface Segregation Principle, ISP)使用多个专门的接口来取代一个统一的接口使用多个专门的接口来取代一个统一的接口 合成复用原则合成复用原则(Composite Reuse Principle, CRP)在系统中应该尽量多使用组合和聚合关联关系,尽量少使在系统中应该尽量多使用

6、组合和聚合关联关系,尽量少使用甚至不使用继承关系用甚至不使用继承关系迪米特法则迪米特法则(Law of Demeter, LoD)一个软件实体对其他实体的引用越少越好,或者说如果两一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互的相互作用,而是通过引入一个第三者发生间接交互合合成复用原成复用原则则指指在一个新的对象里通过关联关系在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,(包括组合关系和聚合关系)来使用一些已有的对象

7、,使之成为新对象的一部分;新对象通过委派调用已有对使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言之:要尽量象的方法达到复用其已有功能的目的。简言之:要尽量使用组合使用组合/聚合关系,少用继承聚合关系,少用继承。聚合关系聚合关系表示一个整体与部分的关系。通常在定义一表示一个整体与部分的关系。通常在定义一个整体类后再去分析这个类的组成结构,从而找出一些成个整体类后再去分析这个类的组成结构,从而找出一些成员类。该整体类与成员类之间形成了聚合关系。在聚合关员类。该整体类与成员类之间形成了聚合关系。在聚合关系中,成员类是整体类的一部分,但成员对象可以脱离整系中,成

8、员类是整体类的一部分,但成员对象可以脱离整体对象独立存在。体对象独立存在。如汽车发动机和汽车是聚合关系。如汽车发动机和汽车是聚合关系。发动发动机是汽车的组成部分,但可以独立存在。机是汽车的组成部分,但可以独立存在。组合关系组合关系也表示类之间的整体和部分的关系。但是组也表示类之间的整体和部分的关系。但是组合关系中部分和整体具有统一的生存期,一旦整体对象不合关系中部分和整体具有统一的生存期,一旦整体对象不存在,部分对象也将不存在。即成员类的存在依赖于整体存在,部分对象也将不存在。即成员类的存在依赖于整体类。类。如人的头与嘴巴之间是组合关系。如人的头与嘴巴之间是组合关系。模式动机模式动机:只需要知

9、道水果的名字则可得到相应的水果:只需要知道水果的名字则可得到相应的水果模式定义模式定义:简单工厂模式专门定义一个类来负责创建其他类:简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。的实例,被创建的实例通常都具有共同的父类。在简单工厂模式中,可以根据参数的不同返回不同类的实例。在简单工厂模式中,可以根据参数的不同返回不同类的实例。三三个角色个角色:Factory:工:工厂厂Product:抽象产:抽象产品品ConcreteProduct:具体产:具体产品品模式结构模式结构依赖依赖简单工厂模式的要点在于:当你需要创建一个对象时,简单工厂模式的要点在于:当你需要创

10、建一个对象时,只须传入一个正确的参数,就可以获取你所需要的对象,只须传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。而无须知道其创建细节。 模式解析模式解析(提提供了专门的工厂类用于创建对供了专门的工厂类用于创建对象,实象,实现了对责任现了对责任的分割:工厂类决定在什么时候创建哪一个产品类的实例,客的分割:工厂类决定在什么时候创建哪一个产品类的实例,客户户端只需要知端只需要知道具体产品类所对应的参数即可道具体产品类所对应的参数即可。这种将对象的。这种将对象的创建和对象本身业务处理分离的做法降低了系统的耦合度。创建和对象本身业务处理分离的做法降低了系统的耦合度。()通通过引入

11、配置文件过引入配置文件,可,可以在不修改任何客户端代码以在不修改任何客户端代码的情况下更换和增加新的具体产品类的情况下更换和增加新的具体产品类,提,提高了系统的灵活性高了系统的灵活性。缺点:缺点:(工厂类的职责相对过重,增加新的产品需要工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则相违背。修改工厂类的判断逻辑,这一点与开闭原则相违背。系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,不利于系统的扩展和维护。不利于系统的扩展和维护。(使用简单工厂模式会增加类的个数,从而增使用简单工厂模式会增加类的个数,从而增加了系统

12、复杂度。加了系统复杂度。模式定义模式定义:工厂方法模式定义一个用于创建对象的接口,让:工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。子类决定实例化哪一个类。 在工厂方法模式中,工厂父类负责定义创建产品对象的在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将的目的是将产品类的实例化操作延迟到工厂子类中完成产品类的实例化操作延迟到工厂子类中完成,即,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。通过工厂子类来确定究竟应该实例化哪一个具体产品类。Product:抽

13、象产品:抽象产品 ConcreteProduct:具体产品具体产品Factory:抽象工厂:抽象工厂 ConcreteFactory:具体工厂:具体工厂模式结构模式结构模式举例模式举例工厂方法实现的计算器工厂方法实现的计算器(P69-70)模式解析模式解析工厂方法模式是简单工厂模式的进一步抽象和推广。保持了简工厂方法模式是简单工厂模式的进一步抽象和推广。保持了简单工厂模式的优点而克服了其缺点。单工厂模式的优点而克服了其缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体而是将

14、具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,使得工厂方法模式可以允许系统在不修改工工厂必须实现的接口,使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。厂角色的情况下引进新产品。 当需要添加新的产品对象时,仅仅需要添加一个具体产品对象当需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好地符合了需要修改客户端,很好地符合了“开闭原则开闭原则”。优点:优点: 工工厂方法用来创建客户所需要的产品,同厂方法用来创建客户所需要

15、的产品,同时向时向客户隐藏客户隐藏了哪种了哪种具具体产品类将被实例体产品类将被实例化化的的细细节,用户只需要关心所需产品对应节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。 在在系统中加入新产系统中加入新产品只品只要添加一个具体工厂和具体产品就可要添加一个具体工厂和具体产品就可以。以。系统的可扩展系统的可扩展性非性非常好,完全符合常好,完全符合“开闭原则开闭原则”。缺点:缺点: 在添加新产品时需要编写新的具体产品类,而且还要提供与之在添加新产品时需要编写新的具体产品类,而且还要提供与之对应的具体工厂类

16、,系统中对应的具体工厂类,系统中类的个数将成对增加类的个数将成对增加,增加了系统,增加了系统的复杂度,更多的类需要编译和运行给系统带来额外开销。的复杂度,更多的类需要编译和运行给系统带来额外开销。 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,中均使用抽象层进行定义,增加了系统的抽象性和理解难度增加了系统的抽象性和理解难度,且在实现时可能需要用到且在实现时可能需要用到DOM、反射等技术,增加了系统的实、反射等技术,增加了系统的实现难度。现难度。在工厂方法模式中只负责生产一类产品,每一个具体工厂在工厂方法模式中

17、只负责生产一类产品,每一个具体工厂对应一种具体产品。对应一种具体产品。但是有时候我们需要一个工厂可以提但是有时候我们需要一个工厂可以提供多个产品对象,而供多个产品对象,而不是单一的产品对象。不是单一的产品对象。例:农场系统例:农场系统两种抽象产品:水果、蔬菜两种抽象产品:水果、蔬菜四种具体产品:北方水果,热带水果,北方蔬菜,热带蔬菜四种具体产品:北方水果,热带水果,北方蔬菜,热带蔬菜两个相关概念两个相关概念()产品等级结构()产品等级结构产品等级结构即产品的继承结构,如一个抽象类是电视机,其产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、子类有海尔电视机、海

18、信电视机、TCL电视机,则抽象电视机与具电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。而具体品牌的电视机是其子类。()产品族()产品族在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电

19、冰箱位于电冰箱产品等级结构中。位于电冰箱产品等级结构中。 模模式定义式定义 抽象工厂模式抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。关或相互依赖对象的接口,而无须指定它们具体的类。模式解析模式解析抽抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法一种形态。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产模

20、式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构品等级结构。当当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。用抽象工厂模式。基基本代码本代码using System;using System.Collections.Generic;using System.Text;namespace 抽象工厂模式抽象工厂模式 class Program static void Main(

21、string args) AbstractFactory factory1 = new ConcreteFactory1(); Client c1 = new Client(factory1); c1.Run(); AbstractFactory factory2 = new ConcreteFactory2(); Client c2 = new Client(factory2); c2.Run(); Console.Read(); abstract class AbstractFactory public abstract AbstractProductA CreateProductA();

22、 public abstract AbstractProductB CreateProductB(); class ConcreteFactory1 : AbstractFactory public override AbstractProductA CreateProductA() return new ProductA1(); public override AbstractProductB CreateProductB() return new ProductB1(); class ConcreteFactory2 : AbstractFactory public override Ab

23、stractProductA CreateProductA() return new ProductA2(); public override AbstractProductB CreateProductB() return new ProductB2(); abstract class AbstractProductA abstract class AbstractProductB public abstract void Interact(AbstractProductA a); class ProductA1 : AbstractProductA class ProductB1 : Ab

24、stractProductB public override void Interact(AbstractProductA a) Console.WriteLine(this.GetType().Name + interacts with + a.GetType().Name); class ProductA2 : AbstractProductA class ProductB2 : AbstractProductB public override void Interact(AbstractProductA a) Console.WriteLine(this.GetType().Name +

25、 interacts with + a.GetType().Name); class Client private AbstractProductA AbstractProductA; private AbstractProductB AbstractProductB; / Constructor public Client(AbstractFactory factory) AbstractProductB = factory.CreateProductB(); AbstractProductA = factory.CreateProductA(); public void Run() Abs

26、tractProductB.Interact(AbstractProductA); 汽车包括车轮、方向盘、发送机等各种汽车包括车轮、方向盘、发送机等各种部件。用户只需要指定汽车的类型就可部件。用户只需要指定汽车的类型就可以得到一辆完整的汽车。以得到一辆完整的汽车。在软件开发中,也存在大量类似汽车一样的复杂对象,在软件开发中,也存在大量类似汽车一样的复杂对象,相当于一辆有待建造的汽车,而对象的属性相当于汽车的相当于一辆有待建造的汽车,而对象的属性相当于汽车的部件,建造产品的过程就相当于组合部件的过程。由于组部件,建造产品的过程就相当于组合部件的过程。由于组合部件的过程很复杂,因此,这些部件的组合

27、过程往往被合部件的过程很复杂,因此,这些部件的组合过程往往被“外部化外部化”到一个称作建造者的对象里,建造者呈现给客到一个称作建造者的对象里,建造者呈现给客户端的是一个已经建造完毕的完整产品对象,而用户无须户端的是一个已经建造完毕的完整产品对象,而用户无须关心该对象所包含的属性以及它们的组装方式。关心该对象所包含的属性以及它们的组装方式。 Builder:抽象建造者:抽象建造者ConcreteBuilder:具体建造者:具体建造者Director:指挥者:指挥者Product:产品角色:产品角色建建造者模式的结构造者模式的结构中引中引入了一个指挥者类入了一个指挥者类Director,该类,该类

28、的作用主要有两个的作用主要有两个:一一方方面面隔隔离了客户与生产过程离了客户与生产过程;另另一方一方面面负负责控制产品的生成过程责控制产品的生成过程。指指挥者针对抽象建造者编程,客户端只需要知道具体建挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。回一个完整的产品对象。 在建造者模式中,客户端不必知道产品内部组成的细节,将在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以产品本身与产品的创建过程解耦,使得相同的创建过程

29、可以创建不同的产品对象。创建不同的产品对象。 每一个具体建造者都相对独立,而与其他的具体建造者无关,每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。用户使用不同的具体建造者即可得到不同的产品对象。 可以更加精细地控制产品的创建过程。将复杂产品的创建步可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。使用程序来控

30、制创建过程。 增加新的具体建造者无须修改原有类库的代码,指挥者类针增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合对抽象建造者类编程,系统扩展方便,符合“开闭原则开闭原则”。 建造者模式所创建的产品一般具有较多的共同点,其组建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。用建造者模式,因此其使用范围受到一定的限制。 如果产品的内部变化复杂,可能会导致需要定义很多具如果产品的内部变化复杂,可能会导致需要定义很多具体建

31、造者类来实现这种变化,导致系统变得很庞大。体建造者类来实现这种变化,导致系统变得很庞大。在软件系统中,有些对象的创建过程较为复杂,而且在软件系统中,有些对象的创建过程较为复杂,而且有时候需要频繁创建,原型模式通过给出一个原型对象来有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的意图所办法创建出更多同类型的对象,这就是原型模式的意图所在。在。原型模式原型模式(Prototype)用原型实例指定创建对象的种类,用原型实例指定创建对象的种类,并且通过拷贝这

32、些原型创建新的对象并且通过拷贝这些原型创建新的对象。Prototype:抽象原型类:抽象原型类ConcretePrototype:具体原型类:具体原型类Client:客户:客户类类原型模式用原型实例指定创建对象的种类,并且通过复制原型模式用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象而无须知道任何创建的细节。原型模式这些原型创建新的对象而无须知道任何创建的细节。原型模式的基本工作原理是通过将一个原型对象传给那个要进行创建的的基本工作原理是通过将一个原型对象传给那个要进行创建的对象,这个要进行创建的对象通过请求原型对象拷贝原型自己对象,这个要进行创建的对象通过请求原型对象拷贝原型

33、自己来实现创建过程。来实现创建过程。当创建新的对象实例较为复杂时,使用原型模式可以简当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过一个已有实例可以提高新实例化对象的创建过程,通过一个已有实例可以提高新实例的创建效率。的创建效率。可以动态增加或减少产品类。可以动态增加或减少产品类。 原型模式提供了简化的创建结构。原型模式提供了简化的创建结构。 可以使用深克隆的方式保存对象的状态。可以使用深克隆的方式保存对象的状态。 需要为每一个类配备一个克隆方法,而且这个克隆需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类方法需要对类的功能进行通盘

34、考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了是件容易的事,必须修改其源代码,违背了“开闭开闭原则原则”。 在实现深克隆时需要编写较为复杂的代码。在实现深克隆时需要编写较为复杂的代码。对于系统中的某些类来说,只有一个实例很重要,例对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务。正在工作的任务。保证一个类只有一个实例的办法是让类自身负责保存保证一个类只有一个实例的办法是让类自身负责保存它

35、的唯一实例。这个类可以保证没有其他实例被创建,并它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。且它可以提供一个访问该实例的方法。单例模式单例模式(Singleton)保证一个类仅有一个实保证一个类仅有一个实例,并提供一个访问它的全局访问点例,并提供一个访问它的全局访问点。instanceif(instance=null) instance=new Singleton();return instance;Singleton- instance : Singleton-+Singleton ()getInstance ().: Singleton:Single

36、ton:单例:单例单例类拥有一个私有构造函数,确保用户无法通过单例类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化它。除此之外,该模式中包含一个私有静关键字直接实例化它。除此之外,该模式中包含一个私有静态成员变量和公有的静态工厂方法,该工厂方法负责检验实态成员变量和公有的静态工厂方法,该工厂方法负责检验实例的存在性并实例化自己,然后存储在静态成员变量中,以例的存在性并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。确保只有一个实例被创建。 提供了对唯一实例的受控访问。因为单例类封装了它的提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客

37、户怎样以及何时访问唯一实例,所以它可以严格控制客户怎样以及何时访问它,并为设计及开发团队提供了共享的概念。它,并为设计及开发团队提供了共享的概念。 由于在系统内存中只存在一个对象,因此可以节约系统由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象,单例模式资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。无疑可以提高系统的性能。 允许可变数目的实例。我们可以基于单例模式进行扩展,允许可变数目的实例。我们可以基于单例模式进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例使用与单例控制相似的方法来获得指定个数的对象实例 由于单例模式

38、中没有抽象层,因此单例类的扩展有很大的由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。困难。 单例类的职责过重,在一定程度上违背了单例类的职责过重,在一定程度上违背了“单一职责原单一职责原则则”。因为单例类既充当了工厂角色,提供了工厂方法,。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。建和产品的本身的功能融合到一起。 滥用单例将带来一些负面问题,如为了节省资源将数据库滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连

39、接池对象的连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;现在很多面向对象语言程序过多而出现连接池溢出;现在很多面向对象语言(如如Java、C#)的运行环境都提供了自动垃圾回收的技术,因的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的对象长时间不被利用,系统会认为它是此,如果实例化的对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致对象状态的丢失。化,这将导致对象状态的丢失。工厂方法模式解决计算器问题的工厂方法模式解决计算器问题的UML图图1.定义计算器类定义计算

40、器类class Operation private double _numberA = 0; private double _numberB = 0; public double NumberA get return _numberA; set _numberA = value; public double NumberB get return _numberB; set _numberB = value; public virtual double GetResult() double result = 0; return result; class OperationAdd : Operation public override double GetResult() double result = 0; result = NumberA + NumberB; return result; class OperationSub : Operation public

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论