资源预览内容
第1页 / 共46页
第2页 / 共46页
第3页 / 共46页
第4页 / 共46页
第5页 / 共46页
第6页 / 共46页
第7页 / 共46页
第8页 / 共46页
第9页 / 共46页
第10页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
设计模式,模式的作用,Gamma,E.,Helm,R.,Johnson,R.,and Vlissides,Design Patterns,Reading,MA.:Addison Wesley,1994,10. 增加应用程序一致性 减少测试时间 减少维护工作 (课本Page 331),一个比喻,三十六计设计模式,三大类别,生成性模式 结构性模式 行为性模式,工厂方法,工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态: 简单工厂(Simple Factory)模式 工厂方法(Factory Method)模式 抽象工厂(Abstract Factory)模式,一、 简单工厂(Simple Factory)模式,Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。 Simple Factory模式实际上不是GoF 23个设计模式中的一员。,二、 Simple Factory模式角色与结构,工厂类角色Creator (LightSimpleFactory):工厂类在客户端的直接控制下(Create方法)创建产品对象。 抽象产品角色Product (Light):定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。 具体产品角色ConcreteProduct (BulbLight, TubeLight):定义工厂具体加工出的对象。,程序举例,Simple Factory.txt,优点与缺点:,优点: 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费“产品。简单工厂模式通过这种做法实现了对责任的分割。,缺点: 当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。 同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。 另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。,工厂方法(Factory Method)模式,工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。,在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。 在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。,Factory Method模式角色与结构,抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。 具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。,抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。 具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。,顺序图,活动过程包括: 客户端创建BulbCreator对象,客户端持有此对象的类型是Creator,而实际类型是BulbCreator。 然后客户端调用BulbCreator的factory方法,之后BulbCreator调用BulbLight的构造函数创造出产品BulbLight对象。,程序举例,#ifndef FACTORY_H #define FACTORY_Hclass Product public:Product()virtual Product() ;class ConcreateProduct: public Product public:ConcreateProduct();virtual ConcreateProduct(); ;class Creator public:Creator()virtual Creator()void AnOperation(); protected:virtual Product* FactoryMethod() = 0; ;class ConcreateCreator: public Creator public:ConcreateCreator();virtual ConcreateCreator(); protected:virtual Product* FactoryMethod(); ;#endif,#include “Factory.h“ #include using namespace std;ConcreateProduct:ConcreateProduct() std:cout “construction of ConcreateProductn“; ConcreateProduct:ConcreateProduct() std:cout “destruction of ConcreateProductn“; void Creator:AnOperation() Product* p = FactoryMethod();std:cout “an operation of productn“; ConcreateCreator:ConcreateCreator() std:cout “construction of ConcreateCreatorn“; ConcreateCreator:ConcreateCreator() std:cout AnOperation();delete p;system(“pause“);return 0; ,工厂方法模式与简单工厂模式,工厂方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。 工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。,当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放封闭“原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。 工厂方法模式退化后可以演变成简单工厂模式。,AbstractFactory,名称 Abstract Factory 结构 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 适用性 一个系统要独立于它的产品的创建、组合和表示时。 一个系统要由多个产品系列中的一个来配置时。 当你要强调一系列相关的产品对象的设计以便进行联合使用时。 当你提供一个产品类库,而只想显示它们的接口而不是实现时。,Abstract Factory,Abstractory Factory,#ifndef ABSTRACTFACTORY_H #define ABSTRACTFACTORY_H/ 抽象基类AbstractProductA,代表产品A的抽象 class AbstractProductA public:AbstractProductA() virtual AbstractProductA(); ;/ 派生类ConcreateProductA1,继承自AbstractProductA,代表产品A的第一种实现 class ConcreateProductA1: public AbstractProductA public:ConcreateProductA1();virtual ConcreateProductA1(); ;/ 派生类ConcreateProductA2,继承自AbstractProductA,代表产品A的第二种实现 class ConcreateProductA2: public AbstractProductA public:ConcreateProductA2();virtual ConcreateProductA2(); ;/ 抽象基类AbstractProductB,代表产品B的抽象 class AbstractProductB public:AbstractProductB() virtual AbstractProductB(); ;/ 派生类ConcreateProductB1,继承自AbstractProductB,代表产品B的第一种实现 class ConcreateProductB1: public AbstractProductB public:ConcreateProductB1();virtual ConcreateProductB1(); ;/ 派生类ConcreateProductB2,继承自AbstractProductB,代表产品B的第二种实现 class ConcreateProductB2: public AbstractProductB public:ConcreateProductB2();virtual ConcreateProductB2(); ;/ 抽象基类AbstractFactory,工厂的抽象类,生产产品A和产品B class AbstractFactory public:AbstractFactory()virtual AbstractFactory()virtual AbstractProductA* CreateProductA() = 0;virtual AbstractProductB* CreateProductB() = 0; ;/ 派生类ConcreateFactory1,继承自AbstractFactory / 生产产品A和产品B的第一种实现 class ConcreateFactory1: public AbstractFactory public:ConcreateFactory1();virtual ConcreateFactory1();virtual AbstractProductA* CreateProductA();virtual AbstractProductB* CreateProductB(); ;/ 派生类ConcreateFactory2,继承自AbstractFactory / 生产产品A和产品B的第二种实现 class ConcreateFactory2: public AbstractFactory public:ConcreateFactory2();virtual ConcreateFactory2();virtual AbstractProductA* CreateProductA();virtual AbstractProductB* CreateProductB(); ;#endif,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号