版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在面向对象编程中,最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。 但是在一些情况下,new操作符直接生成对象会带来一些问题。 举例来说,许多类型对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置;选择生成哪个子对象实例;或在生成你需要的对象之前必须先生成一些辅助功能的对象。在这些情况,新对象的建立就是一个“过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。模式的问题模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢?解决方案解决方案:建立一个工厂来创建对象实现:实现:一、引言一、引言1)还没有工厂时代:假如
2、还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用。2)简单工厂模式:后来出现工业革命。用户不用去创建宝马车。因为客户有一个工厂来帮他创建宝马想要什么车,这个工厂就可以建。比如想要320i系列车。工厂就创建这个系列的车。即工厂可以创建产品。3)工厂方法模式时代:为了满足客户,宝马车系列越来越多,如320i,523i,30li等系列一个工厂无法创建所有的宝马系列。于是由单独分出来多个具体的工厂。每个具体工厂创建一种系列。即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象。你需要指定某个具体的工厂才能生产车出来。4)抽象工厂模式时代:随着客户的要求越来越高
3、,宝马车必须配置空调。于是这个工厂开始生产宝马车和需要的空调。最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车.这就是工厂模式。二、分类二、分类工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。工厂模式可以分为三类:1)简单工厂模式(SimpleFactory)2)工厂方法模式(FactoryMethod)3)抽象工厂模式(AbstractFactory)这三种模式从上到下逐步抽象,并且更具一般性。GOF在设计模式一书中将工厂模式分为两类:工厂方法模式(FactoryMet
4、hod)与抽象工厂模式(AbstractFactory)o将简单工厂模式(SimpleFactory)看为工厂方法模式的一种特例,两者归为一类。三、区别三、区别工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例, 而抽象工厂模式可以创建多个
5、。两者皆可。四、简单工厂模式四、简单工厂模式建立一个工厂(一个函数或一个类方法)来制造新的对象。分布说明引子:从无到有。客户自己创建宝马车,然后拿来用。javaviewplaincopyprint?cn.5.6.publicclassBMW320publicBMW320()System.out.println(制造-BMW320);7.&2.publicclassBMW523publicBMW523()System.out.println(制造-BMW523);6.17.18.publicclassCustomerpublicstaticvo
6、idmain(Stringargs)BMW320bmw320=newBMW320();BMW523bmw523=newBMW523();客户需要知道怎么去创建一款车客户需要知道怎么去创建一款车,客户和车就紧密耦合在一起了客户和车就紧密耦合在一起了为了降低耦合为了降低耦合,就出现了工厂类,把创建宝马的操作细节都放到了工厂里面去,客户直接使用工厂的创建工厂方法,传入想要的宝马车型号就行了,而不必去知道创建的细节这就是工业革命了:简单简单工厂模式工厂模式即我们建立一个工厂类方法来制造新的对象。 如图:abstractclassBMWpublicBMW()4-5-6.publicclassBMW320
7、extendsBMWpublicBMW320()System.out.println(制造-BMW320);publicclassBMW523extendsBMWpublicBMW523()System.out.println(制造-BMW523);javaviewplaincopyprint?工厂类javaviewplaincopyprint?.&5.16.publicclassFactorypublicBMWcreateBMW(inttype)switch(type)case320:returnnewBMW320();case523:ret
8、urnnewBMW523();default:break;returnnull;客户类CDjavaviewplaincopyprint?publicclassCustomerpublicstaticvoidmain(Stringargs)Factoryfactory=newFactory();BMWbmw320=factory.createBMW(320);BMWbmw523=factory.createBMW(523);简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。先来看看它的组成:1)工厂类角色:这是本模式的核心,含
9、有一定的商业逻辑和判断逻辑,用来创建产品2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。3)具体产品角色:工厂类所创建的对象就是此角色的实例。在Java中由一个具体类实现。下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的车型号的时候, 想要一种速度快的新型车, 只要这种车符合抽象产品制定的.5.6.7.&..7.合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一种新型车,都要在工厂类中增加
10、相应因为每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑的创建业务逻辑(createBMW(inttype)方法需要新增方法需要新增case),这显然是违背开闭原则的这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。 由于简单工厂模式中只有一个工厂类来对应这些产品, 所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员。于是工厂方法模式作为救世主出现了。工厂类定义成了接口,而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以
11、扩展了,而不必去修改原来的代码。五、工厂方法模式五、工厂方法模式工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。工厂方法模式组成:1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。4)具体产品角色:具体工
12、厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活起来一当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用, 而不必去修改任何已有的代码。 可以看出工厂角色的结构也是符合开闭原则的!代码如下:产品类:javaviewplaincopyprint?1.abstractclassBMW2.publicBMW().7.&5.publicclassBMW3
13、20extendsBMWpublicBMW320()System.out.println(制造-BMW320);publicclassBMW523extendsBMWpublicBMW523()System.out.println(制造-BMW523);创建工厂类javaviewplaincopyprint?*口口.interfaceFactoryBMWBMWcreateBMW();5.6.7.&2.publicclassFactoryBMW320implementsFactoryBMWOverridepublicBMW320createBMW()returnn
14、ewBMW320();9.20.publicclassFactoryBMW523implementsFactoryBMWOverridepublicBMW523createBMW()returnnewBMW523();客户类javaviewplaincopypr/口口publicclassCustomerpublicstaticvoidmain(Stringargs)FactoryBMW320factoryBMW320=newFactoryBMW320();BMW320bmw320=factoryBMW320.createBMW();FactoryBMW5
15、23factoryBMW523=newFactoryBMW523();BMW523bmw523=factoryBMW523.createBMW();工厂方法模式仿佛已经很完美的对对象的创建进行了包装, 使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。本文继续介绍23种设计模式系列之抽象工厂模式。前面已经介绍过简单工厂模式和工厂方法模式, 这里继续介绍第三种工厂模式一抽象工厂模式,还是以汽车的制造为例。例子背景:随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和
16、发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。宝马320系列配置A型号空调和A型号发动机,宝马230系列配置B型号空调和B型号发动机。概念:抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。比如宝马320系列使用空调型号A和发动机型号A,而宝马230系列使用空调型号B和发动机型号B,那么使用抽象工厂模式,在为320系列生产相关配件时,就无需制定配件的型号,它会自动根据车型生产对应的配件型号A。针对百度百科上对于抽象工厂模式的简介,结合本例如下:当每个抽象产品都有多于一个的具体子类的时候 (空调有型号A和B两种, 发动机也有型号A和B两种),工厂角色怎
17、么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品(产品空调有两个具体产品空调A和空调B)。抽象工厂模式提供两个具体工厂角色(宝马320系列工厂和宝马230系列工厂),分别对应于这两个具体产品角色,每.5.6.7.&9.一个具体工厂角色只负责某一个产品角色的实例化。 每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。抽象工厂模式代码抽象工厂模式代码产品类:javaviewplaincopyprint?毛口毛口1-发动机以及型号2-publicinterfaceEngine3.publicclassEngineAextendsEnginepublicEngine
18、A()System.out.println(制造-EngineA);publicclassEngineBextendsEnginepublicEngineB()System.out.println(制造-EngineB);16/空调以及型号17.publicinterfaceAircondition18.publicclassAirconditionAextendsAirconditionpublicAirconditionA()System.out.println(制造-AirconditionA);publicclassAirconditionBextendsAirconditionpub
19、licAirconditionB()System.out.println(制造-AirconditionB);创建工厂类:.&7.28.29.javaviewplaincopyprint?/创建工厂的接口publicinterfaceAbstractFactory/制造发动机publicEnginecreateEngine();/制造空调publicAirconditioncreateAircondition();/为宝马 320 系列生产配件publicclassFactoryBMW320
20、implementsAbstractFactory0verridepublicEnginecreateEngine()returnnewEngineA();OverridepublicAirconditioncreateAircondition()returnnewAirconditionA();/宝马 523 系列publicclassFactoryBMW523implementsAbstractFactoryOverridepublicEnginecreateEngine()returnnewEngineB();OverridepublicAirconditioncreateAircond
21、ition()returnnewAirconditionB();客户:javaviewplaincopyprint?.5.6.7.&.publicclassCustomer关于抽象工厂模式与工厂方法模式的区别,这里就不说了,感觉多看几遍例子就能理解,还有很多提到的产品族、等级结构等概念,说了反而更难理解。抽象工厂模式的起源抽象工厂模式的起源下面引用一段抽象工厂模式的起源:抽象工厂模式的起源或者最早的应用,是用于创建分属于
22、不同操作系统的视窗构建。比如:命令按键(Button)与文字框(Text)都是视窗构建,在UNIX操作系统的视窗环境和Windows操作系统的视窗环境中,这两个构建有不同的本地实现,它们的细节有所不同。在每一个操作系统中,都有一个视窗构建组成的构建家族。在这里就是Button和Text组成的产品族。 而每一个视窗构件都构成自己的等级结构, 由一个抽象角色给出抽象的功能描述,而由具体子类给出不同操作系统下的具体实现。可以发现在上面的产品类图中,有两个产品的等级结构,分别是Button等级结构和Text等级结构。同时有两个产品族,也就是UNIX产品族和Windows产品族。UNIX产品族由UNIXButton和UNIXText产品构成;而Windows产品族由WindowsButton和WindowsText产品构成。.6.7.&2.13.publicstaticvoidmain(Stringargs)/生产宝马 320 系列配件FactoryBMW320factoryBMW320=newFactoryBMW320();factoryBMW320.createEngine();factoryBMW320.createAircondition();/生产宝马 523 系列配件FactoryBMW523factor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【模块二名篇名句默写】【高分攻略】高考语文一轮复习学案(含答案解析)
- 农业园规划设计
- 石河子大学《数字媒体设计与制作》2023-2024学年第一学期期末试卷
- 石河子大学《工程水文学》2022-2023学年第一学期期末试卷
- 石河子大学《编译原理》2023-2024学年第一学期期末试卷
- 沈阳理工大学《数学提高》2022-2023学年第一学期期末试卷
- 沈阳理工大学《理论力学》2021-2022学年第一学期期末试卷
- 沈阳理工大学《电子测量技术》2022-2023学年期末试卷
- 沈阳理工大学《场地设计》2022-2023学年第一学期期末试卷
- 贵州省贵阳市云岩区房屋租赁合同编号
- 2024年海南省高考历史试卷(含答案解析)
- 24秋国家开放大学《当代中国政治制度》形考任务1-4参考答案
- 医院检验科实验室生物安全程序文件SOP
- “以德育心,以心育德”
- 干部履历表请用开纸双面打印
- 小学语文作文生活化教学实践研究
- 反射反应及反射发育的评定
- M7.5浆砌石砌筑
- 制浆洗漂详细过程工艺
- 吉林省义务教育阶段新课程计划表(新)
- 35kV配电系统调试试验方案
评论
0/150
提交评论