模式三工厂——开花结果

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:为了更好的理解这三个模式,这里分别介绍下产品族和产品等级的概念

产品等级:每一产品与其他产品之间存在的等级关系。比如:桃花和山楂花属于一个产品等级。

产品族:是指位于不同产品等级结构,功能相关联的的产品组成的家族。比如:桃花和桃子属于一个产品族。

时间: 2024-11-10 14:58:08

模式三工厂——开花结果的相关文章

浅析JAVA设计模式之工厂模式(三)

在阅读本文之前,请先阅读(一)和(二)中的简单工厂模式和工厂方法模式. 1抽象工厂模式简介 抽象工厂 (Abstract Factroy) 模式:工具箱模式(kit).抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态,如下图. 图1.1 上图左边有一个工厂类的等级结构,右边有两个不同的产品等级结构,分别是产品A的等级结构和产品B的等级结构,工厂1和工厂2分别负责不同一个产品等级,同一个产品族的产品的生产.又例如下图: 图1.2 上图表示的是Button和Text两个不同产品的等级

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

简单工厂模式 工厂模式 抽象工厂模式

其实这个三个C++的设计模式已经学习很长时间了,今晚才想起来要写这三个设计模式,为什么要用C++中的设计模式呢?for example,你已经会开车了,正着开,倒着开,转弯,这些都是开车基本的,但是你并没有很高的车技,并不会炫酷.漂移,就好像C++中的设计模式一样,在你学好C++的基础上,娴熟的应用出的新技能,能让你的车开的更好. 为什么要用简单工厂模式,记得上一次,我虽然敲完了代码,但是当别人突然问一句,你为什么要用简单工厂模式,我突然就愣住了,代码很简单,一看就懂了.重要的还是思想.专门定义

工厂模式 抽象工厂模式

昨天我们说到了简单工厂模式,今天我们来说说工厂模式,还有抽象工厂模式. 工厂模式,顾名思义,就是在简单工厂模式的基础上继续优化,前面的简单模式当数量多时要改的地方很多,而且比较分散,修改起来比较麻烦,那么我们可以继续封装下. var BookShop=function(type,content){ if(type in BookShop.types){ return new BookShop.types[type](content); }else{ alert("未找到对象"+type

简单工厂模式,工厂方法模式,抽象工厂模式

简单工厂模式.抽象工厂模式.工厂方法模式,这三种工厂模式都属于设计模式中的创建型模式,它们在形式和特点上也多少有些相似,其最终目的都是帮我们将对象的实例化部分取出来,进而优化系统架构,增强系统的扩展性,也就是说更好的体现开放封闭原则. 简单工厂模式: 概念: 简单工厂模式是类的创建模式,又叫做静态工厂方法模式,是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例,涉及到工厂角色.抽象产品角色以及具体产品角色. 结构图: 分析: 一: 简单工厂类是整个模式的关键所在,包含了必要的逻辑判断,根据

PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动更改. 根据抽象程度不同,PHP工厂模式分为:简单工厂模式.工厂方法模式和抽象工厂模式 简单工厂模式: /******代码在原文还是git上都有osgit地址 https://git.oschina.net/mjw/pattern.git  *******/ /** *简单工厂模式与工厂方法模式比较

iOS设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂的生活场景,卖早点的小摊贩,他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂,它生产包子,馒头,地沟油烙的煎饼.该场景对应的UML图如下所示: 图1:简单工厂模式UML图 简单工厂模式的参与者: 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象. 抽象产品(Abstract Product)角色: 是工厂模式所创建对象的父类或是共同拥有的接口.可是抽象类或接口. 具体产品(Conc

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

设计模式之_简单工厂模式、工厂方法模式、抽象工厂模式 、策略模式、策略与工厂的区别(转)

一.前言 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的 幸运的是这种有病的现象在OO语言中可以避免了.下面以Java语言为基础来引入我们本文的主题:工厂模式! 二.简介