设计模式——创建型模式总结

来源:互联网 发布:数据中间件 编辑:程序博客网 时间:2024/05/01 23:17

         设计模式分为三大类:创建型、结构型和行为型,感觉这样分类的依据是根据对象设计角度的不同,三种类型可以说是步步深入的。创建型是对对象的创建进行研究,从而能够高效地创建对象;结构型是在解决了对象创建问题后,进一步解决对象结构设计的问题,对象结构关系设计的好坏会影响到后续程序的维护性、代码的耦合性等;行为型是前两者解决完后,解决对象行为设计的问题。这里主要总结一下创建型模式:

        【知识点】

         1、概念:创建型模式,是用来创建对象的模式,抽象了实例化的过程。它帮助一个系统独 立于如何创建、组合和表示它的对象。都将系统使用哪些具体类的信息封装起来;隐藏这些类的实例是如何被创建和组织的。外界对于这些对象只知道它们共同的接口,而不清楚其具体的实现细节。

          2、种类:

               1).简单工厂模式(Simple Factory)

               2).工厂方法模式(Factory Method)

               3).抽象工厂模式(Abstract Factory)

               4).建造者模式(Builder)

               5)原型模式(Prototype)

               6)单例模式(Singleton)

            3、具体:

               1).工厂三姐妹

               a.简单工厂模式:由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式。


              角色:

             工厂角色(Factory) :是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑,接受客户端的请     求,通过请求负责创建相应的产品对象。

             抽象产品角色(Product):是简单工厂模式所创建的所有产品对象的父类,它负责描述所有实例所共有的公共接口。

             具体产品角色(ConcreteProductA和ConcreteProductB):是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

             例子:我们平时去食堂吃饭,就可以看出一个简单工厂模式,食堂扮演者工厂的角色,食堂根据学生不同的请求,给学生提供相应的具体食品。

             特点:简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化;但是由于一切逻辑都集中在一个工厂类中,“高内聚”方面做的不好,当具体产品不断增多时,需要修改工厂类,违背了“开放-封闭原则”。

             b.工厂方法模式:对简单工厂模式进行了抽象,工厂类成了抽象类,其实际的创建工作将由其具体子类子类来完成,工厂方法使一个类的实例化延迟到其子类。

                   

             特点:一个工厂创建一个产品,所有的具体工厂继承自一个抽象工厂。
                        客户端先创建不同产品的工厂,再由工厂创建具体产品,产品的创建逻辑分散在每个具体工厂类中。
                        客户端只依赖于抽象工厂与抽象产品,不依赖任何具体的工厂与具体产品,符合“依赖倒转原则”。
                        增加新产品时,需要增加工厂类和产品类,符合“开放-封闭原则“。

             c.抽象工厂模式:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态,与工厂方法类似。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。


          特点:

          一个具体工厂创建一个产品族,一个产品族是不同系列产品的组合(ProductA1和ProductB1就是一个产品族),产品创建的逻辑在每个具体工厂类中。所有的具体工厂继承同一个抽象工厂。
          客户端创建不同产品族的工厂,产品族的工厂创建具体的产品对客户端是不可见的。

           产品族扩展困难,需要修改抽象类和具体工厂的方法,看图可知如果增加一组ProductC1和ProductC2,抽象工厂和具体工厂都需要增加方法。抽象类和接口是一个契约,改变契约,所有与契约有关系的代码都要修改,不符合”开放-封闭原则“。但是增加新的产品比较容易如增加ProductA3,完全可以通过扩展实现,符合”开放-封闭原则“。

             d.三姐妹比较

                 简单工厂模式:

                                          一个具体工厂类。

                                         一个抽象产品类,可以派生出多个具体产品类。

                                         具体工厂可以创建多个具体产品的实例,产品的创建逻辑集中与一个工厂类。

                 工厂方法模式:
                                         一个抽象产品类,可以派生出多个具体产品类。   
                                         一个抽象工厂类,可以派生出多个具体工厂类。   
                                         每个具体工厂类只能创建一个具体产品类的实例。

               抽象工厂模式:
                                       多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
                                      一个抽象工厂类,可以派生出多个具体工厂类。   
                                      每个具体工厂类可以创建多个具体产品类的实例。   
    
             区别:
                   简单工厂和工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
                   工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而简单工厂和抽象工厂模式可以创建多个。

                    简单工厂的具体工厂是创建同一等级的多个实例,抽象工厂的具体工厂是创建不同产品族的多个实例。

             2).建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的建构过程可以创建不同的表示。把构建对象实例的逻辑移到了类的外部,在这个类外部定义了这个类的构造逻辑。它把一个复杂对象的构过程从对象的表示中分离出来。其直接效果是将一个复杂的对象简化为一个比较简单的对象。


            Builder是为创建一个Product对象(具体产品角色)的各个部件指定的抽象接口,ConcreteBuilder是具体的建造者,实现Builder接口,Director是指挥者,用来根据用户的需求构建产品对象。建造者模式主要是用于一些复杂的对象,这些对象内部建构间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。它的好处是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

             3).原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。其实就是通过复制现在已经存在的对象来创建一个新的对象。


             “某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。比如说创建实例的构造函数非常的复杂,在执行这个构造函数时会消耗较长的时间,而且这些构造函数中的内容大致相同时,就可以使用原型模式。

             书中这里还涉及到两个概念深复制和浅复制:

             a.浅复制:只复制对象的基本类型,对象类型,仍属于原来的引用。
             b.深复制:不紧复制对象的基本类,同时也复制原对象中的对象,完全产生新对象。

             4).单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。当类只能有一个实例存在,并且可以在全局访问时。这个惟一的实例应该可以通过子类实现扩展,并且用户无须更改代码即可使用。单例模式提供了全局惟一的访问入口,因此易于控制可能发生的冲突。

             

        【小结】

        创建型模式是将系统使用哪些具体类的信息封装起来,隐藏这些类的实例是如何被创建和组织的。外界对于这些对象只知道它们共同的接口,而不清楚其具体的实现细节。现在对设计模式的理解还是很有限的,以后还需在实践中加深理解。

               

              

              

0 0
原创粉丝点击