
抽象工厂模式课件.ppt
38页单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,*,,*,,,软件设计模式,第二讲 抽象工厂模式,抽象工厂模式,,名称,:,抽象工厂模式,(,Abstract Factory Pattern),或,Kit,模式,,意图:提供一系列相关或相互依赖对象的接口而无需指定他们具体的类核心,:,抽象工厂模式(,Abstract Factory Pattern,)提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品,抽象工厂模式,,,抽象工厂模式的动机,,考虑一个支持多种视感(,look- and- feel),表准的用户界面工具包,例如,Motif,和,Presentation Manager,.,,不同的视感风格为滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组建在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格,。
抽象工厂模式的动机,,为解决这一问题,定义一个抽象的,WidgetFactory,类,这个类声明了一个用来创建每一个类基本窗口组件的接口,.,,每一类窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定视感风格对于一个抽象窗口组件类,,WidgetFactory,接口都有一个返回新窗口组件对象的操作客户调用这些操作以获得窗口组件实例,但客户并不知道他们正在使用的是哪些具体类这样客户就不依赖于一般的视感风格抽象工厂模式的作用,,抽象工厂模式的类图,,抽象工厂模式的类图,,抽象工厂模式的时序图,,抽象工厂模式的实例一,,抽象工厂模式的实例二,,大陆生态系统:,,已知动物世界中各个大陆的动物是不同的,例如非洲有狮子和角马,美洲有狼和野牛动物可划分为食草和食肉动物,狮子和美洲狼属于食肉动物,而野牛和角马属于食草动物狮子捕食角马,美洲狼捕食野牛抽象工厂模式的实例二,,抽象工厂模式的实例三,,电脑生产:,,IBM, Dell,都是著名的计算机生产厂家,他们采用的主板、硬盘和,CPU,是不同的,但主板、硬盘和,CPU,之间一定要兼容现硬盘有,Maxtor,和,WestDigit,两种,,CPU,有,AMD,和,Intel,, 主板有,MSI86,5,PE,和,MSIK,7,N,2,G,两种。
IBM,采用,Intel,的,CPU,和,WestDigit,的硬盘,,Dell,采用,AMD,的,CPU,和,Maxtor,的硬盘抽象工厂模式的实例三,,抽象工厂模式的实例三,,抽象工厂模式的实例三,,抽象工厂模式的实例三,,抽象工厂模式的实例三,,抽象工厂模式的实例三,,抽象工厂模式的实例三,,抽象工厂模式的实例四,,综合案例,(,肯德基,),:,,故事中的角色,,肯德基店,—,生产食物的工厂,,食物(麻辣鸡腿汉堡、奥尔良烤鸡翅、薯条、可乐),—,工厂生产的产品,,爸爸、儿子,—,客户,,,抽象工厂模式的实例四,,综合案例,(,肯德基,),:,,抽象化分析,,“,开,-,闭,”,原则,-,抽象,,抽象最大话,-,,“,依赖倒置,”,,,抽象工厂模式的实例四,,抽象工厂模式的实例四,,package com.demo.factory.model;,,,/**,,*,,*食品基类,,*,/,,public abstract class AbstractBaseFood,,{,,//,类别,,protected String kind;,,//,数量,,protected int num;,,//,价格,,protected float price;,,,//,合计,,public float totalPrice(),,{,,return this.num * this.price;,,},,},抽象工厂模式的实例四,,package com.demo.factory.model;,,,/**,,* 抽象食物接口,,*,,*,/,,public interface IFood,,{,,/**,,* 打印输出食物信息,,*,/,,void printMesage();,,},抽象工厂模式的实例四,,package com.demo.factory.model;,,,/**,,* 汉堡类,,*,,*,/,,public abstract class Hamburg extends AbstractBaseFood implements IFood,,{,,,public void printMesage(),,{,,System.,out.println("--" + this.kind + ",风味汉堡,, \t,单价,: "+ this.price + "\t,数量,:",,+ this.num + ", \t,合计,:",,+ this.totalPrice());,,},,},抽象工厂模式的实例四,,package com.demo.factory.model.kfc;,,,import com.demo.factory.model.Hamburg;,,,/**,,* 中国风味的麻辣鸡腿汉堡,,*,,*,/,,public class ChinaHanburm extends Hamburg,,{,,/**,,*构造方法,,*,,* @param kind,,* @param price,,* @param num,,*,/,,public ChinaHanburm(int num),,{,,this.kind = ",麻辣,";,,this.price = 14.0f;,,this.num = num;,,},,},抽象工厂模式的实例四,,package com.demo.factory.itf;,,,import com.demo.factory.model.Beverage;,,import com.demo.factory.model.ChickenWings;,,import com.demo.factory.model.FrenchFries;,,import com.demo.factory.model.Hamburg;,,,/**,,*,肯德基抽象工厂 *,,*,/,,public interface IKfcFactory,,{,,//,生产汉堡,,,public Hamburg createHamburg(int num);,,,//,生产薯条,,,public FrenchFries createFrenchFries(int num);,,,//,生产鸡翅,,,public ChickenWings createChickenWings(int num);,,,//,生产饮料,,,public Beverage createBeverage(int num);,,},抽象工厂模式的实例四,,package com.demo.factory.itf;,,import com.demo.factory.model.Beverage;,,import com.demo.factory.model.ChickenWings;,,…,,public class ChinaKfcFactory implements IKfcFactory,,{,,//,生产可乐,,public Beverage createBeverage(int num),,{,,return new ChinaBeverage(num);,,},,//,生产奥尔良烤鸡翅,,public ChickenWings createChickenWings(int num),,{,,return new ChinaChickenWings(num);,,},,//,成产薯条,,public FrenchFries createFrenchFries(int num),,{,,return new ChinaFrenchFries(num);,,},,//,生产麻辣鸡腿汉堡,,public Hamburg createHamburg(int num),,{,,return new ChinaHanburm(num);,,},,},抽象工厂模式的实例四,,/**,,* 客户类,,*,/,,public class Customer,,{,,//,抽象工厂,,private IKfcFactory kfcFactory;,,//,构造方法将抽象工厂作为参数传入,,public Customer(IKfcFactory kfcFactory),,{,,this.kfcFactory = kfcFactory;,,},,/**,,* 订购食物,,*,/,,//,订购鸡腿汉堡,,public float orderHamburg(int num),,{,,//,获得麻辣鸡腿汉堡,,Hamburg hamburg = kfcFactory.createHamburg(num);,,//,输出订购信息,,hamburg.printMesage();,,//,返回总价,,return hamburg.totalPrice();,,}…,,},,抽象工厂模式的实例四,,public class MainApp,,{,,/**,,* 主应用程序方法,,*,/,,public static void main(String[] args),,{,,/**,,* 定义一个肯德基工厂,IKfcFactory,,*,/,,IKfcFactory kfcFactory = new ChinaKfcFactory();,,/**,,* 用户进入肯德基开始点餐,,*,/,,Customer customer = new Customer(kfcFactory);,抽象工厂模式的实例四,,/**,,*开始点餐,,*,/,,//,一个麻辣鸡腿汉堡,,float hamhurgMoney = customer.orderHamburg(1);,,//,四个新奥尔良烤鸡翅,,float chickenWingsMoney = customer.orderChickenWings(4);,,//,一包薯条,,float frenchFriesMoney = customer.orderFrenchFries(1);,,//,两杯可乐,,float beverageMoney = customer.orderBeverage(2);,,System.,out.println(",总计,: "+ (hamhurgMoney + chickenWingsMoney + frenchFriesMoney + beverageMoney));,,},,},抽象工厂模式的实例四,,1,.多用对象组合,少用继承,,2,.针对抽象编程,不针对实现编程,,3,.产品对象通过工厂暴露的方法创建,抽象工厂模式和工厂模式的区别,,工厂方法模式用来创建一个抽象产品, 具体工厂实现工厂方法来创建具体产品,而抽象工厂模式用来创建一个产品家族的抽象类类型。
抽象工厂模式的优势与缺陷,,优势:隔离了具体类的生成, 使得客户不知道什么被创建了,因此更换一个具体工厂变得相对容易优势:当一个产品族中多个对象被设计成一起工作时, 抽象工厂保证客户端只是用同一产品族中的对象缺陷,:添加新的产品对象时,难以扩展抽象工厂以产生新种类的产品,因为,AbstractFactory,规定了所有可能被创建的产品集合,从而涉及到对,AbstractFactory,及其所有子类的修改抽象工厂模式的优势与缺陷,,优势:隔离了具体类的生成, 使得客户不知道什么被创建了,因此更换一个具体工厂变得相对容易优势:当一个产品族中多个对象被设计成一起工作时, 抽象工厂保证客户端只是用同一产品族中的对象缺陷,:添加新的产品对象时,难以扩展抽象工厂以产生新种类的产品,因为,AbstractFactory,规定了所有可能被创建的产品集合,从而涉及到对,AbstractFactory,及其所有子类的修改抽象工厂模式的应用场景,,一个系统要独立于它产品的创建、组合和表示的时候一个系统要由多个产品系列中的一个来配置时当你要强调一系列相关的产品对象的设计以便进行联合使用时当你提供一个产品类库,而只是想显示他们的接口而不是现实时。
作业,,采用抽象工厂模式对大陆生态模式进行,UML,建模,并进行实现。












