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