首页 > 代码库 > 设计模式之创建型模式(上)

设计模式之创建型模式(上)

没有总结的学习不算学习,这一个月的学习可谓收获多多啊,接下来与大家分享一下。

一、设计模式的分类

总体来说设计模式分为三大类:

1.创建型模式,共五种。

2.结构型模式,共七种。

3.行为型模式,共十一种。


首先研究创建型模式

二. 概述 

创建型模式,就是用来创建对象的模式,抽象了实例化的过程。它帮助一个系统独

立于如何创建、组合和表示它的那些对象。 

三. 为什么需要创建型模式 

所有的创建型模式都有两个永恒的主旋律:

第一,它们都将系统使用哪些具体类的信息封装起来;

第二,它们隐藏了这些类的实例是如何被创建和组织的。

外界对于这些对象只知道它们共同的接口,而不清楚其具体的实现细节。正因为如此,创建型模式在创建什么(what),由谁(who)来创建,以及何时(when)创建这些方面,都为软件设计者提供了尽可能大的灵活性。

四.创建型模式

1.抽象工厂模式

意图提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

比较简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。

 简单工厂:简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。

工厂方法:工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。

抽象工厂:抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

2. 建造者模式

意图将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

适用范围

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

· 当构造过程必须允许被构造的对象有不同的表示时。

与抽象工厂模式的比较

      建造者模式关注于将构造对象的过程和构造的各个部分分开,而抽象工厂关注于构建一个产品系列。实际上,最大的区别是建造者模式创建的产品不一定有共同的父类,只要有类似的构造过程即可

      建造者模式和工厂模式很相象,但是它们有很明显的区别。那就是工厂模式只是根据给的参数不同,工厂"生产"并返回不同的对象。建造者模式除了根据不同参数"生产"不同对象外,这些不同的对象还包含着不同的数据。建造者模式比工厂模式复杂就复杂在多"数据"这一部分。

 3.工厂方法模式

意图定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。

· 优点:实现了开闭原则,可以在不改变工厂的前提下增加新产品。

· 缺点:体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以"高内聚"方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

适用性

· 当一个类不知道它所必须创建的对象的类的时候。

· 当一个类希望由它的子类来指定它所创建的对象的时候。

· 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

3. 原型模式

意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

优点引入Prototype模式后不再需要一个与具体产品等级结构平行的工厂方法类,减少了类的构造,同时客户程序可以在运行时刻建立和删除原型(自定义界面时,此点尤其重要)。

适用性

· 当一个系统应该独立于它的产品创建,构成和表示时;

· 当要实例化的类是在运行时刻指定时,例如,通过动态装载;

·为了避免创建一个与产品类层次平行的工厂类层次时;

· 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

比较

Prototype模式同工厂模式,同样对客户隐藏了对象的创建工作,但是,与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的,达到了"隔离类对象的使用者和具体类型(易变类)之间的耦合关系"的目的。 

5.单例模式

意图:单件模式保证应用只有一个全局惟一的实例,并且提供一个访问它的全局访问点。

结构:包括防止其他对象创建实例的私有构造函数、保存惟一实例的私有变量和全局访问接口等。

比较

· 与全局变量的比较:单件模式维护自身的实例化,在使用时是安全的。一个全局对象无法自行维护,也就无法避免重复创建多个实例,系统资源会被大量占用。

       更糟糕的是在很多情况下会出现逻辑问题,当这些对象访问相同的资源(例如串口时)时,会发生访问冲突。

· 与实用类静态方法的比较:实用类提供系统公用的静态方法,并且也经常采用私有化的构造函数。与单件不同,它没有实例,其中的方法全部是静态方法。
(1)实用类不保存状态,仅提供功能。
(2)实用类不具有多态性,而单件可以有子类。
(3)单件是对象,实用类只是方法的集合。

优点

· 实例控制:Singleton会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例

· 灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

适用性

· 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

· 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

     感悟:一个月的学习,在我为设计模式的神奇而感到惊叹的同时,让我体会更深的是,学习真是源自于点点滴滴。开始接触这本书的时候,看到这么厚的课本,还有点抵触,然而当学习了一段时间反而会去主动接触它。学习不可怕,可怕的是你的心态不正确。