设计模式之反思(二)

      上篇博客说道了设计模式的结构型模式,这次我们来看看创建型模式,同时总结一下从中得到的一些体会。

      二、创建型

             1、三个工厂

                  (1)简单工厂——Simple Factory


                               设计模式之反思(二)_第1张图片

                               ①简单工厂就是根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

                               ②优缺点:

                                实现了对对象创建和使用的分离,将变化封装在了工厂中

                                减少用户记忆量,直接传入所需参数即可,不必知道具体的类名

                                通过引入配置文件,可以在不改变客户端代码的前提下增加具体的产品类,从而使系统更加灵活

                               ③原则:

                                违背了开闭原则,符合迪米特法则和依赖倒转原则

                  (2)工厂方法——Factory Method

                       设计模式之反思(二)_第2张图片

例子              设计模式之反思(二)_第3张图片

                      ①在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构

                      ②工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

                      ③优缺点

                         采用多态性设计,它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。

                         可扩展性较好,完全符合开闭原则

                         缺点就是增加了系统的复杂度,可理解性相对较差

                      ④原则

                          完全符合开闭原则,符合依赖倒转原则

                  (3)抽象工厂——Factory Method

                        设计模式之反思(二)_第4张图片

                      在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族。

                      ①抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

                      ②优缺点

                          符合开闭原则,系统可扩展性较好

                          利用配置文件加反射增加了系统的灵活性

                          系统较为复杂,不易理解

                      ③原则

                          符合开闭原则和依赖倒转原则

                  (4)三个工厂关系

                         简单工厂只有一条生产线,生产一种产品;工厂方法有多条生产线,但是每条生产线只能生产某一种产品;抽象工厂有多条生产线,每条生产线可以生产多种不同的产品。

                         三个工厂在一定条件下是可以转换的(利用极端化的思想)。简单工厂是工厂方法的特例,工厂方法又是抽象工厂的特例。

             2、建造者模式——Builder

                   设计模式之反思(二)_第5张图片

                  (1)它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。

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

                  (3)优缺点

                           将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

                           易扩展,符合开闭原则。每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”

                                  可以更加精细的控制创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

                                  建造者模式创建的对象之间一般具有很多共同点,其组成部分相似,否则不适合用此模式

                                  一般所要创建的产品内部比较简单,变化性较小。如果产品内部比较复杂,就要使用多个建造者来封装变化,增加系统的复杂度

                  (4)原则

                         符合开闭原则,依赖倒转原则以及迪米特法则              

             3、原型模式——Prototype

                    设计模式之反思(二)_第6张图片

                         在使用原型模式时,我们需要首先创建一个原型对象,再通过复制这个原型对象来创建更多同类型的对象。

                  (1)原型模式(Prototype  Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

                  (2)优缺点

                           可以提高新实例的创建效率。

                                  扩展性较好,由于在原型模式中提供了抽象原型类,在客户端可以针对抽象原型类进行编程,而将具体原型类写在配置文件中,增加或减少产品类对原有系统都没有任何影响。

                                  原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式就不需要这样,原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品。

                                  可以使用深克隆的方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(如恢复到某一历史状态),可辅助实现撤销操作。

                                 每一个类需要配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”。

                                  当需要深克隆时,需要自己编写较为复杂的深克隆代码,而且还要注意里面是否有多重嵌套引用。

                  (3)原则

                          违背了开闭原则,符合单一职责原则

      三、感想

            从这次讲课中,我们学到的不仅仅是设计模式,更重要的是学习如何去学习。

            学习是一个过程,先是由简到繁,然后是由繁到简。学习的第一步就是先把它看扁,觉得它很简单,很容易,然后随着学习的深入,你就会发现它很复杂,然后经过自己的抽象,封装再将它变得简单,这就是学习的过程。这种学习不是轻易就能运用自如的,需要自己去练习。

            有时我们在思考问题的时候,不妨把问题极端化,看看有什么意外的收获。比如我们在做一件事情之前,先想一下最好的情况,在想一下最坏的情况,如果这两种情况我们都能够处理,那么其他情况也就So Easy。

             综上,学习是一条没有尽头的路,也是我们要走一生的路。

你可能感兴趣的:(设计模式之反思(二))