抽象工厂模式.doc_第1页
抽象工厂模式.doc_第2页
抽象工厂模式.doc_第3页
抽象工厂模式.doc_第4页
抽象工厂模式.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

抽象工厂模式抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向具体产品提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。 所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。增加新的工厂和新的产品族很方便。在以下情况下可以使用抽象工厂模式:一个系统不应当依赖于产品类实例如何被创建、 组合和表达的细节,这对于所有形态的工厂模式都是重要的。 系统有多于一个的产品族,而客户端只消费其中某一产品族。 属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现 游戏中使用抽象工厂的地方有: 基本上任何有批量的同类形式的子件地方就会有工厂的存在。(实例工厂就是工厂,而抽象工厂仅仅是工厂的一个抽象层而已。)在游戏中,比如有一些场景,可是场景有很多类型,但是所有的具体场景都有相同的共性(如房屋,植物等),将这些共性抽取出来,形成一个抽象类,然后在程序中具体实现该类,这样一个抽象类就是一个简单的抽象工厂1:例如,在音频方面,一个音频的抽象工厂派生出不同的工厂,有音乐工厂,音效工厂。音效工厂中又有一个创建3D音效节点的方法,一个创建普通音效节点的方法。最终用户只需要SoundFactory-Create3DNode( pFileName );就可以创建一个节点了。2:场景对象。3:渲染对象。程序实现Factory.h#include /class Foodpublic:Food() virtual Food() public:virtual std:string getName() return _name; protected:std:string _name;/class Burger : public Foodpublic:Burger() Burger(std:string name) _name = name; virtual Burger() ;/class Chips : public Foodpublic:Chips() Chips(std:string name) _name = name; virtual Chips();/class ChickenWing : public Foodpublic:ChickenWing() ChickenWing(std:string name) _name = name; virtual ChickenWing() ;/class FastFoodFactorypublic:FastFoodFactory() virtual FastFoodFactory() public:virtual Burger* makeBurger() return new Burger; virtual Chips* makeChips() return new Chips; virtual ChickenWing* makeChickenWing() return new ChickenWing; ;class MacDonaldFactory : public FastFoodFactorypublic:MacDonaldFactory() virtual MacDonaldFactory() public:virtual Burger* makeBurger() return new Burger(MacDonaldBurger); virtual Chips* makeChips() return new Chips(MacDonaldChips); ;class KFCFactory : public FastFoodFactorypublic:KFCFactory() virtual KFCFactory() public:virtual Burger* makeBurger() return new Burger(KFCBurger); virtual Chips* makeChips() return new Chips(KFCChips); virtual ChickenWing* makeChickenWing() return new ChickenWing(KFCChickWing); ;/=class Shoppublic:Shop()virtual Shop();virtual void foodList() = 0;public:virtual void createShop(FastFoodFactory *) = 0;/class MacDonaldShop : public Shoppublic:MacDonaldShop() virtual MacDonaldShop()if(_burger) delete _burger;if(_chips) delete _chips;public:virtual void createShop(FastFoodFactory *a);virtual void foodList();protected:Burger *_burger;Chips *_chips;/class KFCShop : public Shoppublic:KFCShop() virtual KFCShop()if(_burger) delete _burger;if(_chips) delete _chips;if(_chicken) delete _chicken;public:virtual void createShop(FastFoodFactory *a);virtual void foodList();protected:Burger *_burger;Chips *_chips;ChickenWing *_chicken;Factory.cpp#include #include factory.hint main()MacDonaldFactory *mFactory = new MacDonaldFactory;KFCFactory *kFactory = new KFCFactory;MacDonaldShop *mShop =

温馨提示

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

评论

0/150

提交评论