工厂模式JAVA

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

JAVA工厂模式•工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式的几种形态•(1)简单工厂(SimpleFactory)模式,又称静态工厂方法模式(StaticFactoryMethod•Pattern)。•(2)工厂方法(FactoryMethod)模式,又称多态性工厂(PolymorphicFactory)模式•或虚拟构造子(VirtualConstructor)模式;•(3)抽象工厂(AbstractFactory)模式,又称工具箱(Kit或Toolkit)模式。简单工厂实例•比如说有一个农场公司,专门向市场销售各类水果。在这个系统里需要描述下列的水果:•葡萄Grape•草莓Strawberry•苹果Apple•水果与其他的植物有很大的不同,就是水果最终是可以采摘食用的。那么一个自然的作法就是建立一个各种水果都适用的接口,以便与农场里的其他植物区分开。•代码清单1:接口Fruit的源代码•publicinterfaceFruit•{•/**•*生长•*/•voidgrow();•/**•*收获•*/•voidharvest();•/**•*种植•*/•voidplant();•}代码清单2:类Apple的源代码publicclassAppleimplementsFruit{privateinttreeAge;publicvoidgrow(){log(Appleisgrowing...);}publicvoidharvest(){log(Applehasbeenharvested.);}publicvoidplant(){log(Applehasbeenplanted.);}publicstaticvoidlog(Stringmsg){System.out.println(msg);}publicintgetTreeAge(){returntreeAge;}publicvoidsetTreeAge(inttreeAge){this.treeAge=treeAge;}}代码清单3:类Grape的源代码publicclassGrapeimplementsFruit{privatebooleanseedless;publicvoidgrow(){log(Grapeisgrowing...);}publicvoidharvest(){log(Grapehasbeenharvested.);}publicvoidplant(){log(Grapehasbeenplanted.);}publicstaticvoidlog(Stringmsg){System.out.println(msg);}publicbooleangetSeedless(){returnseedless;}publicvoidsetSeedless(booleanseedless){this.seedless=seedless;}}类Strawberry的源代码publicclassStrawberryimplementsFruit{publicvoidgrow(){System.out.println(Strawberryisgrowing...);}publicvoidharvest(){System.out.println(Strawberryhasbeenharvested.);}publicvoidplant(){System.out.println(Strawberryhasbeenplanted.);}}•FruitGardener类的源代码publicclassFruitGardener{publicstaticFruitfactory(Stringwhich)throwsBadFruitException{if(which.equalsIgnoreCase(apple)){returnnewApple();}elseif(which.equalsIgnoreCase(strawberry)){returnnewStrawberry();}elseif(which.equalsIgnoreCase(grape)){returnnewGrape();}else{thrownewBadFruitException(Badfruitrequest);}}}简单工厂模式的结构•工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java类实现。•抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java接口或者Java抽象类实现。•具体产品(ConcreteProduct)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。Creator类的源代码publicclassCreator{publicstaticProductfactory(){returnnewConcreteProduct();}}抽象角色Product接口的源代码publicinterfaceProduct{}具体产品角色ConcreteProduct类的源代码publicclassConcreteProductimplementsProduct{publicConcreteProduct(){}}多层次的产品结构简单模式的优缺点•优点:模式的核心是工厂类。这个类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式通过这种做法实现了对责任的分割。•缺点(一):当产品类有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变,就是模式的缺点。这个工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类,有人把这种类叫做上帝类(GodClass)。如果这个全能类代表的是农场的一个具体园丁的话,那么这个园丁就需要对所有的产品负责,成了农场的关键人物,他什么时候不能正常工作了,整个农场都要受到影响。•缺点(二):当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难。•缺点(三):由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。“开–闭”原则•“开–闭”原则要求一个系统的设计能够允许系统在无需修改的情况下,扩展其功能。•简单工厂角色只在有限的程度上支持“开–闭”原则。工厂方法模式•工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。•首先,在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。工厂方法模式的结构工厂方法模式的系统涉及到的角色•抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在上面的系统中这个角色由Java接口Creator扮演;在实际的系统中,这个角色也常常使用抽象Java类实现。•具体工厂(ConcreteCreator)角色:担任这个角色的是实现了抽象工厂接口的具体Java类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。在本系统中给出了两个这样的角色,也就是具体Java类ConcreteCreator1和ConcreteCreator2。工厂方法模式的系统涉及到的角色•抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在本系统中,这个角色由Java接口Product扮演;在实际的系统中,这个角色也常常使用抽象Java类实现。•具体产品(ConcreteProduct)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。实例(农场)工厂方法模式和简单工厂模式•工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。•工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。工厂方法模式和简单工厂模式•与简单工厂模式中的情形一样的是,ConcreteCreator的factory()方法返还的数据类型是一个抽象类型Product,而不是哪一个具体产品类型,而客户端也不必知道所得到的产品的真实类型。这种多态性设计将工厂类选择创建哪一个产品对象、如何创建这个对象的细节完全封装在具体工厂类内部。•对于增加新的产品类而言,这个系统完全支持“开-闭”原则。抽象工厂模式抽象工厂模式与工厂方法模式的区别•抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。抽象工厂模式的结构•抽象工厂模式[GOF95]是对象的创建模式,它是工厂方法模式的进一步推广。•假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式。这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。•下面就以一个示意性的系统为例,说明这个模式的结构。产品结构A和B系统类图抽象工厂模式涉及到的角色•抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用Java接口或者抽象Java类实现,而所有的具体工厂类必须实现这个Java接口或继承这个抽象Java类。•具体工厂类(ConreteFactory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体Java类实现这个角色。抽象工厂模式涉及到的角色•抽象产品(AbstractProduct)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java接口或者抽象Java类实现这一角色。•具体产品(ConcreteProduct)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体Java类实现这个角色。•一般而言,有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法。•每一个产品等级结构中有多少具体产品,就有多少个产品族,也就会在工厂等级结构中发现多少个具体工厂。在什么情形下应当使用抽象工厂模式?(1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的;(2)这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;(上面这一条叫做抽象工厂模式的原始用意。)(3)同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体现出来;(4)系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。抽象工厂模式在农场系统中的实现“开-闭”原则(1)增加新的产品族?(2)增加新的产品等级结构?

1 / 58
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功