一、模式所采用的关系(e.g.继承…)
-
UML图例
二、各模式的特点、优缺点
1.创建型
将对象的使用和创建分离,使用对象时无需知道对象的创建细节,使得创建过程可以多次复用,且修改两者中的一个对另一个影响为0或很少。
软件系统运行时,类将实例化为对象,并由对象来协作完成各项业务功能。创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和使用进行分离。
外界只需知道他们的共同接口而无需知道具体的细节,符合单一职责原则。
- 简单工厂(依赖、继承)
优点:
(1)实现对责任的分割
(2)客户端无需知道具体产品类的类名,只需知道对应参数即可,对于一些复杂的类名,可以减少使用者的记忆量
(3)通过引入配置文件,可以在不修改任何客户端代码的情况下更换,增加新的具体的产品类,一定程度上提高了系统的灵活性
缺点:
(1)工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都要受影响
(2)会增加系统中类的个数,一定程度上增加了系统的复杂度和理解难度
(3)系统拓展困难,一旦增加新产品就不得不修改工厂逻辑,产品类型较多时,有可能会使工厂逻辑过于复杂,不利于系统的拓展和维护
(4)由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构
适用环境:
(1)创建对象少
(2)客户端对创建对象不关心 - 工厂方法(依赖、继承)
优点:
(1)用户无需关心细节,无需知道具体类名
(2)多态性设计,工厂可以自主确定创建何种对象,而细节完全封装在具体工厂内部,又被称为多态工厂模式,所有的工厂类都具有同一抽象父类
(3)在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品即可。系统的可扩展性也就变得非常好,符合“开闭原则”。
缺点:
(1)在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
(2)由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到 DOM、反射等技术,增加了系统的实现难度。
适用情况:
(1)一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
(2)一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
(3)将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。 - 抽象工厂方法(依赖、继承)
优点
(1)抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
(2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
(3)增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”
缺点
在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
适用环境
(1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。用户无须关心对象的创建过程,将对象的创建和使用解耦。
(2)系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
(3)属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来,同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,此时具有一个共同的约束条件:操作系统的类型。
(4)系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。对于这些产品,用户只需要知道它们提供了哪些具体的业务方法,而不需要知道这些对象的创建过程,在客户端代码中针对抽象编程,而将具体类写人配置文件中。
三、工厂模式的核心结构
四、面向对象设计原则,包括其定义以及为什么要遵循,最好熟悉一些遵循各原则的例子
五、模式分类
-
5种创建型口诀:抽象工厂 按照 工厂方法,生成 单例 原型
7种结构型口诀:外观 装饰 按照 适配 的方式 桥接 组合,给 亨元 代理
记住前面的12种,剩下的都是行为型 -
创建型模式
-
结构型模式
-
行为型模式(1)
-
行为型模式(2)