您好,欢迎访问三七文档
第二讲抽象工厂模式抽象工厂模式名称:抽象工厂模式(AbstractFactoryPattern)或Kit模式意图:提供一系列相关或相互依赖对象的接口而无需指定他们具体的类。核心:抽象工厂模式(AbstractFactoryPattern)提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品。抽象工厂模式抽象工厂模式的动机考虑一个支持多种视感(look-and-feel)表准的用户界面工具包,例如Motif和PresentationManager.不同的视感风格为滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组建。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。抽象工厂模式的动机为解决这一问题,定义一个抽象的WidgetFactory类,这个类声明了一个用来创建每一个类基本窗口组件的接口.每一类窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定视感风格。对于一个抽象窗口组件类,WidgetFactory接口都有一个返回新窗口组件对象的操作。客户调用这些操作以获得窗口组件实例,但客户并不知道他们正在使用的是哪些具体类。这样客户就不依赖于一般的视感风格。抽象工厂模式的作用抽象工厂模式的类图抽象工厂模式的类图抽象工厂模式的时序图抽象工厂模式的实例一抽象工厂模式的实例二大陆生态系统:已知动物世界中各个大陆的动物是不同的,例如非洲有狮子和角马,美洲有狼和野牛。动物可划分为食草和食肉动物,狮子和美洲狼属于食肉动物,而野牛和角马属于食草动物。狮子捕食角马,美洲狼捕食野牛。抽象工厂模式的实例二抽象工厂模式的实例三电脑生产:IBM,Dell都是著名的计算机生产厂家,他们采用的主板、硬盘和CPU是不同的,但主板、硬盘和CPU之间一定要兼容。现硬盘有Maxtor和WestDigit两种,CPU有AMD和Intel,主板有MSI865PE和MSIK7N2G两种。IBM采用Intel的CPU和WestDigit的硬盘,Dell采用AMD的CPU和Maxtor的硬盘。抽象工厂模式的实例三抽象工厂模式的实例三抽象工厂模式的实例三抽象工厂模式的实例三抽象工厂模式的实例三抽象工厂模式的实例三抽象工厂模式的实例三抽象工厂模式的实例四综合案例(肯德基):故事中的角色肯德基店—生产食物的工厂食物(麻辣鸡腿汉堡、奥尔良烤鸡翅、薯条、可乐)—工厂生产的产品爸爸、儿子—客户抽象工厂模式的实例四综合案例(肯德基):抽象化分析“开-闭”原则-抽象抽象最大话-“依赖倒置”抽象工厂模式的实例四抽象工厂模式的实例四packagecom.demo.factory.model;/****食品基类*/publicabstractclassAbstractBaseFood{//类别protectedStringkind;//数量protectedintnum;//价格protectedfloatprice;//合计publicfloattotalPrice(){returnthis.num*this.price;}}抽象工厂模式的实例四packagecom.demo.factory.model;/***抽象食物接口**/publicinterfaceIFood{/***打印输出食物信息*/voidprintMesage();}抽象工厂模式的实例四packagecom.demo.factory.model;/***汉堡类**/publicabstractclassHamburgextendsAbstractBaseFoodimplementsIFood{publicvoidprintMesage(){System.out.println(--+this.kind+风味汉堡,\t单价:+this.price+\t数量:+this.num+,\t合计:+this.totalPrice());}}抽象工厂模式的实例四packagecom.demo.factory.model.kfc;importcom.demo.factory.model.Hamburg;/***中国风味的麻辣鸡腿汉堡**/publicclassChinaHanburmextendsHamburg{/***构造方法**@paramkind*@paramprice*@paramnum*/publicChinaHanburm(intnum){this.kind=麻辣;this.price=14.0f;this.num=num;}}抽象工厂模式的实例四packagecom.demo.factory.itf;importcom.demo.factory.model.Beverage;importcom.demo.factory.model.ChickenWings;importcom.demo.factory.model.FrenchFries;importcom.demo.factory.model.Hamburg;/***肯德基抽象工厂**/publicinterfaceIKfcFactory{//生产汉堡publicHamburgcreateHamburg(intnum);//生产薯条publicFrenchFriescreateFrenchFries(intnum);//生产鸡翅publicChickenWingscreateChickenWings(intnum);//生产饮料publicBeveragecreateBeverage(intnum);}抽象工厂模式的实例四packagecom.demo.factory.itf;importcom.demo.factory.model.Beverage;importcom.demo.factory.model.ChickenWings;…publicclassChinaKfcFactoryimplementsIKfcFactory{//生产可乐publicBeveragecreateBeverage(intnum){returnnewChinaBeverage(num);}//生产奥尔良烤鸡翅publicChickenWingscreateChickenWings(intnum){returnnewChinaChickenWings(num);}//成产薯条publicFrenchFriescreateFrenchFries(intnum){returnnewChinaFrenchFries(num);}//生产麻辣鸡腿汉堡publicHamburgcreateHamburg(intnum){returnnewChinaHanburm(num);}}抽象工厂模式的实例四/***客户类*/publicclassCustomer{//抽象工厂privateIKfcFactorykfcFactory;//构造方法将抽象工厂作为参数传入publicCustomer(IKfcFactorykfcFactory){this.kfcFactory=kfcFactory;}/***订购食物*///订购鸡腿汉堡publicfloatorderHamburg(intnum){//获得麻辣鸡腿汉堡Hamburghamburg=kfcFactory.createHamburg(num);//输出订购信息hamburg.printMesage();//返回总价returnhamburg.totalPrice();}…}抽象工厂模式的实例四publicclassMainApp{/***主应用程序方法*/publicstaticvoidmain(String[]args){/***定义一个肯德基工厂IKfcFactory*/IKfcFactorykfcFactory=newChinaKfcFactory();/***用户进入肯德基开始点餐*/Customercustomer=newCustomer(kfcFactory);抽象工厂模式的实例四/****///一个麻辣鸡腿汉堡floathamhurgMoney=customer.orderHamburg(1);//四个新奥尔良烤鸡翅floatchickenWingsMoney=customer.orderChickenWings(4);//一包薯条floatfrenchFriesMoney=customer.orderFrenchFries(1);//两杯可乐floatbeverageMoney=customer.orderBeverage(2);System.out.println(总计:+(hamhurgMoney+chickenWingsMoney+frenchFriesMoney+beverageMoney));}}抽象工厂模式的实例四1.多用对象组合,少用继承2.针对抽象编程,不针对实现编程3.产品对象通过工厂暴露的方法创建抽象工厂模式和工厂模式的区别工厂方法模式用来创建一个抽象产品,具体工厂实现工厂方法来创建具体产品,而抽象工厂模式用来创建一个产品家族的抽象类类型。抽象工厂模式的优势与缺陷优势:隔离了具体类的生成,使得客户不知道什么被创建了,因此更换一个具体工厂变得相对容易。优势:当一个产品族中多个对象被设计成一起工作时,抽象工厂保证客户端只是用同一产品族中的对象。缺陷:添加新的产品对象时,难以扩展抽象工厂以产生新种类的产品,因为AbstractFactory规定了所有可能被创建的产品集合,从而涉及到对AbstractFactory及其所有子类的修改。抽象工厂模式的优势与缺陷优势:隔离了具体类的生成,使得客户不知道什么被创建了,因此更换一个具体工厂变得相对容易。优势:当一个产品族中多个对象被设计成一起工作时,抽象工厂保证客户端只是用同一产品族中的对象。缺陷:添加新的产品对象时,难以扩展抽象工厂以产生新种类的产品,因为AbstractFactory规定了所有可能被创建的产品集合,从而涉及到对AbstractFactory及其所有子类的修改。抽象工厂模式的应用场景一个系统要独立于它产品的创建、组合和表示的时候。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库,而只是想显示他们的接口而不是现实时。作业采用抽象工厂模式对大陆生态模式进行UML建模,并进行实现。
本文标题:抽象工厂模式
链接地址:https://www.777doc.com/doc-509763 .html