乐于分享
好东西不私藏

《软件设计模式》笔记1

《软件设计模式》笔记1

一个好的系统设计具有的性质

1.可扩展性:容易将新的功能添加到现在系统中。

2.灵活性:代码修改时不会波及很多其他模块。

3.可插入性:可以很方便地将一个类抽取出去,同时将另一个有相同结构的类添加进来。

一、简单工厂模式

1.模式动机

只需要知道水果的名字则可得到相应的水果

2.模式定义

简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

在简单工厂模式中,可以根据参数的不同返回不同类的实例。

3.模式结构

简单工厂模式包含如下三个角色:

Factory:工厂

Product:抽象产品

ConcreteProduct:具体产品

4.模式解析

简单工厂模式的要点在于:当你需要创建一个对象时,只须传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

5.优点

实现了对责任的分割,它提供了专门的工厂类用于创建对象。

客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。

通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

6.缺点

由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

使用简单工厂模式将会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。

系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

二、工厂方法模式

1.模式定义

工厂方法模式——定义一个用于创建对象的接口,让子类决定实例化哪一个类。

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

2.意义

在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。很好地符合了“开闭原则”,即工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。工厂方法模式退化后可以演变成简单工厂模式。

3.优点

在工厂方法模式中,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。

基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。

4.缺点

在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度由于考虑到系统的可扩展性,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

5.适用环境

一个类不知道它所需要的对象的类;一个类通过其子类来指定创建哪个对象;将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

三、策略模式

1.产生背景

完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。

2.模式定义

策略模式(Strategy)——定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法的变化不影响使用算法的客户。

3.解析

策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。

策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。

四、建造者模式

1.模式定义

建造者模式(Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2.模式结构

建造者模式包含如下四个角色:

Builder:抽象建造者

ConcreteBuilder:具体建造者

Director:指挥者

Product:产品角色

3.补充知识

(1)泛型

泛型是具有占位符(类型参数)的类、结构、接口和方法。通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。

泛型类

class Test

{

public T obj;

public Test(T obj)

{this.obj = obj;}

}

(2)foreach循环用于列举出集合中所有的元素,格式中in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。

4总结

建造者模式适用于当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。

五、装饰者模式

1.模式动机

装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展

2.模式定义

装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。

3.模式结构

装饰模式包含如下角色:

Component: 抽象构件

ConcreteComponent: 具体构件

Decorator: 抽象装饰类

ConcreteDecorator: 具体装饰类

4.小结

动态地将责任附加到对象上,想要扩展功能,装饰者提供有别于继承的另一种选择。

要点

1.继承属于扩展形式之一,但不见得是达到弹性设计的最佳方案。

2.设计中应该允许行为扩展,而不须修改现有的代码。(开闭原则)