在面向对象的世界里,设计模式从来就没有最好最强的,各个模式从来就谁也不服谁,彼此明争暗斗,未曾善罢甘休。今天,连同简单工厂模式在内的24个设计模式齐聚中原,霎时间,乌云密布,杀气冲天,面向对象的世界里要迎来一场浩劫,血雨腥风,在所难免
在资格赛中,来自工厂家族的简单工厂模式首先被灭掉了,其致命的失误在于简单工厂模式根本不符合开放—封闭原则,因此惨遭灭门也是不足为怪的。然而让人欣慰的是,工厂家族的另两个派系工厂方法模式和抽象工厂模式都晋级了小组赛,并且被分在了同一组,这样看来他们不得不自相残杀,其命运令人堪忧啊。
我们来看看各个模式的分组情况:首先是创建型模式小组,分别包含单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式5个派系,其次是结构型模式小组:分别包含适配器模式、装饰模式、桥接模式、组合模式、享元模式、代理模式以及外观模式7大实力强劲的门派,由于本组的各个模式实力都比较强,因此也被称为死亡之组,最后是行为型模式组,由于这一组的的派系较多,被分为了两个小组:行为一组和行为二组,先来看行为一组都有谁,观察者模式、模板方法模式、命令模式、状态模式和职责链模式,行为二组有解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式。
首先,我们了解一下创建型模式组的各个模式都有什么过人之处,如何能在面向对象的设计中占有一席之地,以至于能够称霸武林。
抽象工厂模式:提供一个创建一系列或者相关依赖对象的接口,而无需指定它们具体的类。
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类。
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
单例模式:保证一个类仅有一个实例,并且提供一个访问它的全局访问点。
大家各就各位后,开始了激战:抽象工厂模式说:创建型模式的优势在于隐藏了这些类的实例是如何被创建和放在一起的,整个系统关于这些对象所知道的是由抽象类所定义的接口。如此一来,创建型模式在创建了什么,谁创建的,怎么被创建的以及何时创建的等方面提供了很大的灵活性。
原型模式使出了自己的绝招:我们可以建立相应数目的原型并克隆他们通常比每次用合适的状态收工实例化该类更方便一些。
建造者模式也用了独门武功:我们将一个复杂对象的构建与它的表示分离,如此便可轻松地改变一个产品的内部表示,并且使得构造代码和表示代码分开。这样对客户来讲,无需关心产品的创建过程,而只要告诉我们需要什么就可以用同样的构建过程创建不同的产品出来。
单例模式略显单薄,但也不甘示弱:对一些类来说,一个实例是非常重要的,一个全局对象可以使得一个对象被访问,但是不能防止客户实例化多个对象,而我们的独门秘籍就是让类自身负责保存它的唯一实例,同时将类外的实例化道路封死,并且提供一个访问该实例的方法,这样就使得对唯一实例可以严格地控制客户怎样以及何时访问它。
最后工厂方法模式放出了大招,顿时天昏地暗:天下设计,无不源自工厂,当设计者发现需要更大的灵活性时,方才向其他创建型模式演化!溯其本源,在我工厂!
果然是杀伤力极强的武功,尽显王者风范,最终的结果不言而喻
谁是面向对象设计中的霸主?(上)