1.情景与模式
时间:2014年4、5月 地点:廊坊师范 人物:学生
四五月份的季节,学校里边各种花草树木蓬勃生长。十二教后花园中的桃树仿佛一夜之间百花齐绽,惹得众多女生拍照留念。在桃树的引领之下山楂树上点点白光也日渐增多。下面我用设计模式中的简单工厂模式的UML图来简单展示一下PeachFlower和HawthornFlower
简单工厂模式
大家都知道在我们学校除了桃树和山楂树之外还有很多像石榴、梨树什么的,它们也都是开花的果树,如果用简单工厂来展示的话,每增加一种开花果树就要修改原有的SimpleFactory,这严重违背了OCP对修改封闭、对扩展开放的理念,所以我们引入工厂方法模式,重画简单工厂模式的UML图后为
工厂方法模式
这样当我们想加入石榴花的时候,只需要再增加一个PomegranateFlower类继承Flower类、一个PomegranateFactory继承FactoryMethod类即可,对原有的类不作任何修改。
由于花开的太漂亮了,总是让人情不自禁的想摘几朵以好好观赏。对于以前像我这样没那么怜香惜玉的人来说伸手捞几朵来简直易如反掌,丝毫没有犯罪感。好在舍友及时解救了我,告诫到:别忘了去年给你的山楂。好吧,“花开堪折直须折”并不是什么时候都适用的,为了今年还能拿着山楂一边砸人一边吃的热闹,我就忍了。
话说回来,如果把果实也加到我们的工厂中,这个该怎么实现呢?对于这类需求的增加,好像简单工厂和工厂方法都没有给出明确指示,接下来就让我们的抽象工厂(AbstractFactory)上手吧
抽象工厂模式
有了抽象工厂的帮助,不管是果实的成熟还是整棵树的兴盛衰落貌似都能一清二楚的展示了。
2.三工厂模式(创建型模式)
众所周知在设计模式中,三工厂模式的联系尤为密切,有了前边的情景铺垫,接下来从理论上来理解下。这三个模式主要为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。(三种模式都使客户端脱离了与具体产品的耦合,客户端不关注具体产品的生产方法。)
1)简单工厂模式(Simple Factory):建立一个工厂(一个函数或一个类方法)来制造新的对象。又称静态工厂方法(Static Factory)模式,由于不满足OCP,被排除在23种GOF设计模式之列。
过程:一个具体工厂通过条件语句创建多个产品,产品的创建逻辑集中在一个工厂类。客户端通过传不同的参数给工厂,实现创建不同产品的目的。
弊端:但是增加新产品时,需要修改工厂类、增加产品类,不符合OCP原则。
2)工厂方法模式(Factory Method):将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。实例化对象,用工厂方法代替new操作。
过程:一个工厂创建一个产品,所有的具体工厂继承自一个抽象工厂。客户端先创建不同产品的工厂,再由工厂创建具体产品,产品的创建逻辑分散在每个具体工厂类中。客户端只依赖于抽象工厂与抽象产品,不依赖任何具体的工厂或产品。
弊端:增加新产品时,需要增加工厂类和产品类,符合OCP原则,但增加新的产品族时,无法很好解决。
3)抽象工厂模式(Abstract Factory):为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
过程:一个具体工厂创建一个产品族,一个产品族是不同系列产品的组合,产品创建的逻辑分在每个具体工厂类中,所有的具体工厂继承自同一个抽象工厂。客户端创建不同产品族的工厂,产品族的工厂创建具体的产品对客户端是不可见的。
弊端:需要借助反射和配置文件来真正地满足OCP。
区别
1)这三种模式从上到下逐步抽象,并且更具一般性。简单工厂模式可以看成工厂方法模式的一种特例。
2)工厂方法模式针对的是一个产品等级结构;抽象工厂模式针对的是多个产品等级结构。
PS:为了更好的理解这三个模式,这里分别介绍下产品族和产品等级的概念
产品等级:每一产品与其它产品之间存在的等级关系。例如:桃花和山楂花属于一个产品等级。
产品族:是指位于不同产品等级结构,功能相关联的的产品组成的家族。例如:桃花和桃子属于一个产品族。