java设计模式第4讲抽象工厂jzkangta_第1页
java设计模式第4讲抽象工厂jzkangta_第2页
java设计模式第4讲抽象工厂jzkangta_第3页
java设计模式第4讲抽象工厂jzkangta_第4页
java设计模式第4讲抽象工厂jzkangta_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《Java与模式》作者博 电子工第14章抽象工厂 在阅读本章之前,请首先阅读本书的“简单工厂(SimpleFactory)模式”以及“工厂方法(FactoryMethod)模式”两章。 一个系统需要消费多个抽象产品角色,这些抽象产品角色可以用Java接口或者抽象但是,正如上面所的,这些抽象产品角色是由Java接口或者抽象Java类实现的, 为了方便引进抽象工厂模式,特地引进一个新的概念:产品族(ProductFamily。所应当的是,虽然大多数的文献都以一个含有两个层次(抽象和具体层次)的产品抽象工厂模式[GOF95]是对象的创建模式,它是工厂方法模式的进一步推广。产品对象创建问题。比如下面就是两个具有相同等级结构的A和产品等级B的 如果使用相图描述的话,会看到在相图上出现两个等级结构A和B,以及两个产品族1和2。如下图所示。象工厂角色Creator中加以。产品等级结构A和产品等级结构B的结构图如下所示。抽象工厂(Factory)角色:担任这个角色的是工厂方法模式的,它是与应用系统的商业逻辑无关的。通常使用Java接口或者抽象Java类实现,而所有的具体工厂类必须实现这个Java接口或继承这个抽象Java类。业逻辑紧密相关的。通常使用具体Java类实现这个角色。抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java接口或者抽象Java类实现这具体产品(ConcreteProduct)角色:抽象工厂模式所创建的任何产品对象都是某统的商业逻辑。通常使用具体Java类实现这个角色。packagecom.javapatterns. publicinterfaceCreator{*产品等级结构A的工厂方publicProductA*产品等级结的工厂方publicProductB}package publicclassConcreteCreator1implements{*产品等级结构A的工厂方publicProductA{returnnew}*产品等级结的工厂方publicProductB{returnnew}}package publicclassConcreteCreator2implements{*产品等级结构A的工厂方publicProductA{returnnew}*产品等级结的工厂方publicProductB{returnnew}}象产品角色是由一个Java接口实现的。packagecom.javapatterns. publicinterfaceProductA{}产品等级结构A的抽象产品接口。packagecom.javapatterns. publicclassProductA1implementsProductA{public{}}实现了产品等级结构A的抽象产品接口。packagecom.javapatterns. publicclassProductA2implementsProductA{public{}}packagecom.javapatterns. publicinterfaceProductB{}题:Java接口”一章产品等级结构B的抽象产品接口。packagecom.javapatterns. publicclassProductB1implementsProductB{*public{}}产品等级结构B的抽象产品接口。packagecom.javapatterns. publicclassProductB2implementsProductB{*public{}}文献[GOF95],在以下情况下应当考虑使用抽象工厂模式Windows操作系统的视窗环境中,这两个构件有不同的本地实现,它们的细节也有所不在每一个操作系统中,都有一个视窗构件组成的构件。在这里就是Button和Text可以发现在上面的产品类图中,有两个产品的等级结构,分别是Button等级结构和Text等级结构。同时有两个产品族,也就是UNIX产品族和Windows产品族。UNIX产品族由UnixButtonUnixText产品构成Windows产品族WinButtonWinText产品构成。UnixFactoryWinFactoryUnixFactoryUnix产品族中的产品,而章中曾经仔细讨论过一个农场公司从小到大的发展过程。而如今,农场公司再次新的因此,在这个系统里面,产品分成两个等级结构:水果(Fruit)和蔬菜(eggie。下下面则是蔬菜(Veggie)的类图Tropical和Northern。坐标图上出现了四个坐标点,分别代表TropicalFruit(热带水果、TropicalVeggie(热带蔬菜、NorthernFruit(北方水果)NorthernVeggie(北方蔬菜)代码10:接口publicinterfaceGardenerNorthernGardenerTropicalGardener均是抽象工厂类Gardener代码11:具体工厂类packagecom.javapatterns. factoryfarm;publicclassNorthernGardenerimplementsGardener{*publicFruitcreateFruit(String{returnnew}*{returnnew}}代码12:具体工厂类TropicalGardenerpackagecom.javapatterns. factoryfarm;publicclassTropicalGardenerimplementsGardener{*publicFruitcreateFruit(String{returnnew}*{returnnew}}代码13:接口Veggie代码14:具体产品类NorthernVeggiepackagecom.javapatterns. factoryfarm;publicclassNorthernVeggieimplementsVeggie{privateString{}publicString{return}publicvoidsetName(String{=}}代码15:具体产品类TropicalVeggie{privateString*{=}publicString{return}publicvoidsetName(String{=}}代码16:抽象产品角色Fruit的源代码packagecom.javapatterns. publicinterfaceFruit{}代码17:抽象产品角色NorthernFruit的源代码packagecom.javapatterns. publicclassNorthernFruitimplementsFruit{privateStringpublicNorthernFruit(String{}publicString{return}publicvoidsetName(String{=}}代码18:抽象产品角色TropicalFruit的源代码packagecom.javapatterns. publicclassTropicalFruitimplementsFruit{privateString{}publicString{return}publicvoidsetName(String{=}}PCIBMIBM克隆机系列;另一个系列是MAC,或MacIntosh系列。产品等级结构也有两个,一个是RAM,另一个是CPU。NorthernGardenerTropicalGardener的一个实例就可以了。在计算机生产的例子中,PcProducerMacProducer也分别只需要一个实例。因在本书的“简单工厂(SimpleFactory)模式”一章中,曾经谈到在简单工厂模式中,java.util.DateFormat为例子讲解这一做法。如下JavaAWT义了两套平行的等Java的构件Componentpeer构件ComponentPeer为超类。Java构件Java程序提供java.awt.Toolkit类;这个抽象类在不同的操作系统中有不同的具体子类,并为每一个peer构件提供了相应的工厂方法,以创建并且返还一个peer构件的实例。下面的图显示了Java构件Button通过调用Toolkit工厂对象创建一个ButtonPeer对象的情况。ButtonButtonPeer的通讯图。ButtonJavaToolkit对象与peer构件通讯。在这个结构中,Toolkit就是抽象工厂角色,它的具体实现是具体工厂本章后面的附录“附录:JavaAWTPeer架构与抽象工厂模式”,以及本书的“桥梁(Bridge) 应用到了创造各种动物身上。可以想到,把绳子搅到泥水里,然后把沾满泥水的绳的阴绳造出的是女人和雌动物,阳绳造出的是和雄动物。读者可以看出,造物用的是抽象工厂模式。在这个故事里面,的“产品”有划分。的绳子按照阴、阳划分,产品则按照人、兽划分。造万物系统里阴、阳两生产系统的具体工厂类按照这一方案改造,给出UML类图和源代码。ComputerProducergetProducer()的下划线,表明代码19:抽象类ComputerProducer的方法getProducer(Stringpublicclass{publicstaticComputerProducergetProducer(String{if{returnnew}elseif{}{}}}

returnnewreturn是静态的。MacProducerPcProducer的构造子是私有的,因此,这两个类必须自己将自代码20:抽象工厂类ComputerProducerpublicclass{publicstaticComputerProducergetInstance(String{if{return}elseif{return}}}代码21:具体工厂类MacProducer是单例publicclassMacProducerextends{privatestaticMacProducerm_MacProducer=newMacProducer();*private{}*publicCpu{returnnewMa}*publicRam{returnnew}*publicstaticMacProducer{return}}publicclassPcProducerextends{privatestaticPcProducerm_PcProducer=newPcProducer();*private{}*publicCpu{returnnewP}*publicRam{returnnew}*publicstaticPcProducer{return}}[ZUKOWSKI97]JohnZukowski,JavaAWTReference,publishedbyO'Reilly,在“抽象工厂(Factory)模式”一章中的“抽象工厂模式的”一节中,本书使际上,在Java语言的AWT确实使用了抽象工厂模式创建分属于不同操作系统的peer构本节就对AWT这个库,特别是库中的Toolkit类及其子类作一个,以说明抽象工厂模式是怎么应用到AWT库中的。PeerJava程序总是显示所在操作系统的视感(LookandFeelJavaPeerJavaToolkit接口,负责peer对象的创建。这种三重接口的架构,叫做Peer架构;显然,Peer架构是桥梁在运行时,Peer架构会自行调用这个Toolkit对象,创建出所需要的peer对象。上面的结构图分成上下两个部分,下方的部分给出的就是java.awt.peers库中所有的产品角色与Peer在下图中,显示了两个产品等级结构,即ButtonPeerLabelPeer等级结构;以及三个Windows产品族,Solaris/Motif产品族,以及Unix/OpenWin产品族。实际上,要想收集到所有的产品族的产品(ZButton,WButtonMButton等分Windows,Unix/OpenWin,以Solaris/Motifpeer构件JDKpeer构件。java.awt.Toolkit。JavaToolkit的具体子类。读者可以看出,图中显示的三个Toolkit的具体子类分别对应于三个不同的操作环境;而如果添加上Macintosh的话,就应当再加上一个Toolkit的具体子类(应当是sun.awt.acos.Moolkit。从上面的图可以Toolkit对象位于工厂等级结构中,负

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论