当前位置: 首页 > >

05 C#设计模式-抽象工厂模式解析_图文

发布时间:

Design Patterns www.ChinaSA.info 抽象工厂模式 刘 伟 (Sunny) weiliu_china@126.com www.ChinaSA.info 大纲 ? 产品等级结构与产品族 ? 抽象工厂模式概述 ? 抽象工厂模式的结构与实现 ? 抽象工厂模式的应用实例 ? 开闭原则的倾斜性 ? 抽象工厂模式的优缺点与适用环境 www.ChinaSA.info 产品等级结构与产品族 ? 工厂方法模式 ? 每个具体工厂只有一个或者一组重载的工厂方法,只 能生产一种产品,可能会导致系统中存在大量的工厂 类,势必会增加系统的开销 ? 抽象工厂模式 ? 一个工厂可以生产一系列产品(一族产品),极大减 少了工厂类的数量 www.ChinaSA.info 产品等级结构与产品族 ? 概念 ? 产品等级结构:产品等级结构即产品的继承结构 ? 产品族:产品族是指由同一个工厂生产的,位于不同 产品等级结构中的一组产品 一个产品族 产品族 一个产品等级结构 五个产品族,分属于 三个不同的产品等级 结构 产品等级结构 www.ChinaSA.info 抽象工厂模式概述 ? 模式动机 ? 当系统所提供的工厂生产的具体产品并不是一个简单的对象,而 是多个位于不同产品等级结构、属于不同类型的具体产品时就可 以使用抽象工厂模式 ? 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的 一种形式 www.ChinaSA.info 抽象工厂模式概述 ? 抽象工厂模式的定义 抽象工厂模式:提供一个创建一系列相关或相互依赖对象 的接口,而无须指定它们具体的类。 Abstract Factory Pattern: Provide an interface for creating families of related or dependent objects without specifying their concrete classes. ? 对象创建型模式 www.ChinaSA.info 抽象工厂模式概述 ? 抽象工厂模式的定义 ? 又称为工具(Kit)模式 ? 抽象工厂模式中的具体工厂不只是创建一种产品,它 负责创建一族产品 ? 当一个工厂等级结构可以创建出分属于不同产品等级 结构的一个产品族中的所有对象时,抽象工厂模式比 工厂方法模式更为简单、更有效率 Client www.ChinaSA.info 抽象工厂模式的结构与实现 AbstractFactory AbstractProductA ? 抽象工厂模式的结构 + CreateProductA () : AbstractProductA + CreateProductB () : AbstractProductB ... ConcreteFactory1 + CreateProductA () : AbstractProductA + CreateProductB () : AbstractProductB ... ConcreteProductA1 ConcreteProductA2 AbstractProductB ConcreteFactory2 + CreateProductA () : AbstractProductA + CreateProductB () : AbstractProductB ... ConcreteProductB1 ConcreteProductB2 www.ChinaSA.info 抽象工厂模式的结构与实现 ? 抽象工厂模式的结构 ? 抽象工厂模式包含以下4个角色: ? AbstractFactory(抽象工厂) ? ConcreteFactory(具体工厂) ? AbstractProduct(抽象产品) ? ConcreteProduct(具体产品) www.ChinaSA.info 抽象工厂模式的结构与实现 ? 抽象工厂模式的实现 ? 典型的抽象工厂类代码: abstract class AbstractFactory { public abstract AbstractProductA CreateProductA(); //工厂方法一 public abstract AbstractProductB CreateProductB(); //工厂方法二 …… } www.ChinaSA.info 抽象工厂模式的结构与实现 ? 抽象工厂模式的实现 ? 典型的具体工厂类代码: class ConcreteFactory1 : AbstractFactory { //工厂方法一 public override AbstractProductA CreateProductA() { return new ConcreteProductA1(); } //工厂方法二 public override AbstractProductB CreateProductB() { return new ConcreteProductB1(); } …… } ? 实例说明 某软件公司要开发一套界面皮肤库,可以对基于.NET平台的桌面软件进行界面 www.ChinaSA.info 美化。用户在使用时可以通过菜单来选择皮肤,不同的皮肤将提供视觉效果不同 的按钮、文本框、组合框等界面元素,例如春天(Spring)风格的皮肤将提供浅绿色 的按钮、绿色边框的文本框和绿色边框的组合框,而夏天(Summer)风格的皮肤则 提供浅蓝色的按钮、蓝色边框的文本框和蓝色边框的组合框,其结构示意图如下 图所示: 抽象工厂模式的应用实例 浅绿色的按钮 Spring风格 绿色边框的文本框 绿色边框的组合框 皮肤库 浅蓝色的按钮 Summer风格 蓝色边框的文本框 蓝色边框的组合框 界面皮肤库结构示意图 该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同



友情链接: