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

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

一、设计模式的分类

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

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

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

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

首先研究创建型模式

二. 概述

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

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

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

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

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

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

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

四.创建型模式

1.
抽象工厂模式

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

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

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

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

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

2. 建造者模式

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

适用范围:

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

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

与抽象工厂模式的比较

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

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

3.工厂方法模式

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

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

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

适用性:

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

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

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

3. 原型模式

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

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

适用性:

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

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

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

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

比较

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

5.单例模式

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

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

比较

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

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

· 与实用类静态方法的比较:实用类提供系统公用的静态方法,并且也经常采用私有化的构造函数。与单件不同,它没有实例,其中的方法全部是静态方法。

(1)实用类不保存状态,仅提供功能。

(2)实用类不具有多态性,而单件可以有子类。

(3)单件是对象,实用类只是方法的集合。

优点 :

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

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

适用性 :

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

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

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

 

设计模式之创建型模式(上),布布扣,bubuko.com

时间: 06-11

设计模式之创建型模式(上)的相关文章

【设计模式】创建型模式之抽象工厂Abstract Factory

抽象工厂Abstract Factory是一种创建型设计模式,目的在于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.抽象工厂的类图如下,客户仅与抽象类定义的定义的接口交互,而不使用特定的具体类的接口.一个系统包含多种产品时,AbstractFactory声明创建各种抽象产品对象的操作接口,这些接口是直接暴露给Client的,而具体产品对象的创建则延迟到子类ConcreteFactory,Client面对的产品类是AbstractProduct,无需关系具体产品类是什么.在运

设计模式之创建型模式—— 1.5 原型模式

<?php /**  * 1.5 原型模式  *  解决的问题:  *  某些结构复杂的对象的创建工作,由于需  *  求的变化,这些对象经常面临着剧烈的变  *  化,但是它们却有用比较稳定一种的接口.  *  解决的方案:  *   用原型实例指定创建对象的种类,并且通  *   过拷贝这些原型创建新的对象.  *  该模式无需任何角色:  *   因为在PHP中,在每个声明的类中已经默认  *   包含了克隆函数,所以无需单独在建立一个  *   抽象类来实现克隆操作了.  *  优点:

设计模式之创建型模式—— 1.1 简单工厂模式

<?php                  /** * 1.1 简单工厂模式 * * 解决的问题: *  如何解决多个类实例化对象的问题. *  注意:因为是简单工厂模式,所以要实例 *    化的类不能太多,否则请使用1.2节 *    的工厂方法模式. * * 解决方案: *  建立一个工厂(即一个工厂类),通过参数的 *  传递动态决定应该创建哪一个产品类(这些 *  产品类继承自一个父类或接口)的实例. *  *  * 该模式中包含三种角色: *  注:这里的角色指的就是类! *  1

设计模式之创建型模式—— 1.2 工厂方法模式

<?php /**  * 1.2 工厂方法模式  * 解决的问题:  *  如何解决多个类实例化对象的问题.  *   * 解决的方案:  *  定义一个用于创建对象的接口,让子类决定  *  实例化哪一个类.工厂方法使一个类的实例  *  化延迟到其子类.  *   * 该模式包含四种角色:  *  1. 抽象产品角色(一个)  *  职责:它是具体工厂角色所创建的对象  *    的父类.负责描述所有实例所共  *    有的公共接口.  *  2. 具体产品角色  *  职责:它是具体工厂

设计模式之创建型模式—— 1.3 抽象工厂模式

<?php /**  * 1.3 抽象工厂模式  * 解决的问题:  *  如何解决多个类实例化对象的问题.  * 解决的方案:  *  提供一个创建一系列相关或相互依赖对象的  *    接口,而无需指定它们具体的类.  * 该模式包含四种角色:  *  1. 抽象产品角色(两个或多个)  *  职责:同工厂方法模式  *    2. 具体产品角色  *    职责:同工厂方法模式  *      3. 抽象工厂角色  *    职责:同工厂方法模式  *      4. 具体工厂角色  * 

设计模式之创建型模式—— 1.4 单例模式

<?php /**  * 1.4 单例模式  *  解决的问题:  *   如何确保一个特殊类的实例是独一无二的  *   ,也就是说这个实例是它所属类的唯一一  *   个实例对象,并且很容易的对它进行存取?  *  解决的方案:  *   保证一个类仅有一个实例,并提供一个访  *   问它的全局访问点.  *  该模式包含一种角色:  *   1. 单例角色  *  优点:  *   1. 始终保持唯一的一个实例.  *   2. 可对此唯一实例进行访问控制.  *  缺点:  *   1

设计模式之创建型模式—— 1.6 建造者模式

<?php /**  * 1.6 建造者模式  * 定义:  *  将一个复杂对象的构建与它的表示分离  *  ,使得同样的构建过程可以创建不同的  *  表示.  * 此模式包含三种角色:  *  1. 抽象建造者角色  *  职责:  *  用于指定规则和流程  *  2. 具体建造者角色  *  职责:  *  具体的建造过程  *  3. 指挥者角色  *  职责:  *  用于指挥建造过程  *      4. 具体产品角色  *  * 优点:  *  1. 封装性  *  2. 建造

设计模式---创建型模式

一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. (3)行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 二.设计模式的六大原则 1.开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修

java设计模式--创建型模式

2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory)  这三种模式从上到下逐步抽象,并且更具一般性.GOF在<设计模式>一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory).将简单工厂模式