zoukankan      html  css  js  c++  java
  • 设计模式 创建型模式

     

    1.设计模式之创建型模式分为5类:抽象工厂,构造者,工厂方法,原型,单例

    2.创建型模式指的是获取对象的方法,如何通过我们的类之间的结构搭建灵活的,扩展型强的对象获取系统.

    3.这五类可以这样来加以说明:

           3.1 抽象工厂:它适用于一组产品的更换,也就是说,我们有一系列的产品,他们因为某种风格组成一组形成系统的某种风格.系统可能拥有很多风格,因而每一种风格都应该对应一组不同的产品.我们定义一个抽象工厂,工厂中给出了产生所有抽象产品的定义,每一种风格由它的具体工厂定义完成,因此具体工厂有多少,风格就有多少,也就是我们的产品组就有多少组,每一个具体工厂能做的就是产生具体的产品.当然对于每个抽象产品来说有多少个具体产品,就有多少种风格,他们会分别被各个具体工厂产生.这样就形成了一种对应关系.抽象工厂和抽象产品同时在两个维度扩展,形成一张正交的网络来体现系统的可扩展性,然而对于框架来说,系统的产品数量扩展的难度要大,因为扩展产品的种类,意味着要改变抽象工厂和具体工厂的代码.而系统风格的增多就容易的多,增加一种风格,意味着增加一种具体工厂,对每个产品都生成一个新风格的具体产品,它只是增加而已,并不会修改系统框架的代码.

           3.2 构造者:构造者其实是一种委托关系,也就是委托者把一系列的功能或动作交给被委托者来完成.委托者我们称之为指挥者,被委托者就是我们的构造者.构造者是一个抽象类,它定义了所有这一系列动作的原型.它的子类定义所有这些动作,这样形成一种处理风格.当我们传递给指挥者不同的风格处理时,就实现了我们的扩展,每扩展一个构造者,我们就重新定义这一组操作,我们也就定义了一种风格.而指挥者对这一切都不需关心. 构造者和抽象工厂都是实现不同风格的创建模式,他们的区别在于,抽象工厂实现的是一组产品的风格,每个产品都有可能不同,而构造者实现的是对一组操作来说的,如果我们把这一组操作看作是一个产品的操作的话,我们也可以说构造者实现的是单个产品级的风格扩展,而抽象工厂实现的是产品组级的风格扩展.

          3.3 工厂方法:创建者提供统一的办法创建某个特定的产品.因此这种模式下产生了抽象的创建者和抽象的产品,每一种具体的创建者都对应一种具体的产品.这听起来和构造者模式简直一样,似的,他们却是很像,一个具体的构建者负责的就是对应一种具体的特定产品.它和构建者基本上有两点区别: a.构建者是有主从之分的,指挥者需保存一个构造者的实例来调用构造者所实现的实际方法.工厂方法提供的是产生独立的产品的接口和产品本生并不产生组合的关系. b.构建者通过一组实现不同的函数来表示扩展的,也就是说它的扩展是函数级的,而工厂方法却是产品级的,也就是说工厂方法里的扩展是以产品为单位的.

          3.4 原型:原型并没有象上述三种模式一样强调和产品的关系.它其实只是强调了提供服务的一方,他们通过继承体系而沿袭的同一函数定义.通过这种方式,保证原型的扩展不用惊动框架.其实这种方式在Java中以及很容易做到,因为该语言本身就支持这样一个clone函数,通过该函数,整个继承体系内的对象都可以统一获取到,框架只需要把握对基类的统一引用,子类就可以方便的扩展.

          3.5 单例:我想单例就是完全取代了全局变量吧.比起把它称作为模式来说,我更愿意称之为技巧.单例模式的实现有三点: a.一个静态的私有该类的变量 b.一个私有的构造函数 c.一个取得单例的函数,且该函数在第一次被调用的时候构造这个唯一的单例(调用b->赋值a->返回a). 它的好处自然不必多费口舌.

    以上转自 曹想华 读<设计模式>

    ------------------

    关于Creational Patterns的个人愚见:
    Abstract Factory : 继承自抽象的工厂产生一系列继承自抽象产品的具体产品. 便于扩展在一系列的产品.
    Builder : 对某一件产品的产生有比较自由的控制, 如果基类Builder的比较全面, 可以在其子类实现不同产品的构造(override), 相当于定制产品的感觉.
    Factory Method : 用CreateProduct()之类的方法返回某一种产品, 再利用.
    Prototype : 相当于实现ICloneable接口, 减少类的定义. 方便得到程序中用得较多, 但是变动不大的实例对象. 可以用Register()的方法先注册示例, 需要的时候在hashtable中的取出再克隆.
    Singleton : 让仅仅一个类的示例存在于系统中.

  • 相关阅读:
    工作中常用git命令总结
    工作中,实用map给数组去重的详解
    关于OC中的block自己的一些理解(一)
    存储过程专题(Oracle)
    ORACLE事物隔离级别和脏读、幻读、不可重复读区别
    C#客户端Json转DataTable
    C# Newtonsoft.Json JObject常用方法
    C#中的内部函数(子函数)
    C# Dev GridView当前行
    C#从数据库中加载照片的
  • 原文地址:https://www.cnblogs.com/Dabay/p/364959.html
Copyright © 2011-2022 走看看