ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

创建型模式-抽象工厂

创建型模式-抽象工厂 目录对象工厂解决什么问题使用场景参与者优缺点优点缺点实现代码示例定义参与者实现使用场景协作优缺点优点缺点代码示例工厂模式是一种创建新模式。对象工厂定义一个用于创建对象的接口让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类解决什么问题面向对象的技术总是企图打破对具象型别的依存性然而在C中对象的生成却将调用者绑死于最底层具象派生类可能不直接调用new而是调用某一具有更高级别的对象中的虚函数Create从而让客户可以通过多态性来改变行为了解型别信息但这种信息无法以C表达如可能拥有一个字符串包含Derived因此需要产生一个Derived的对象使用场景程序库不仅需要操作用户自定义对象还需要产生他们第一种情况产生的对象需要以某种标识符保存其实际型别通过其标识符再取出具体对象当一个类不知道她所必需创建的对象的类的时候当一个类希望由它的子类来指定它所创建的对象的时候当类将创建对象的职责委托给多个帮助子类种的一个并且你希望将哪一个帮助子类是代理者这一信息局部化的时候主要用于面向对象程序框架和程序库以及各种串流处理和对象持久的设计中参与者Product定义工厂方法所创建的对象的接口ConcreteProduct实现Product的接口Creator声明工厂方法该方法返回一个Product对象Creator也可以定义一个工厂方法的缺省实现返回一个缺省的ConcreteProduct对象ConcreteCreator重定义工厂方法以返回一个ConcreteProduct实例优缺点优点工厂方法不再将与特定应有有关的类绑定到你的代码中与多态相比将型别绑定于实值的动作被推迟的更远是一种懒初始化的方式缺点客户可能仅仅为了创建一个特定的ConcreteFactory对象就不得不创建Creator的子类实现主要有两种不同的情况Creator是一个抽象类并且不提供它所声明的工厂方法的实现Creator是一个具体类而且为工厂方法提供了一个缺省的实现参数化工厂方法使用模板以避免创建子类一个可伸缩的工厂的具体设计注册型别标识符ID和用于产生对象的函数指针/仿函数型别标识符用来标识具体对象的型别由于C静态型别系统之故必须先有一个型别标识符才能生成一个产品型别标识符的管理由用户负责对象生产者函数或仿函数专门用来生成某一类对象。通过函数指针来模塑产品生产者取消注册参数化工厂方法通过型别标识符返回具体对象代码示例// 产品基类classProduct{public:virtual~Product(){}virtualstd::stringOperation()const0;};// 具体产品类1classConcreteProduct1:publicProduct{public:std::stringOperation()constoverride{return{Result of the ConcreteProduct1};}};// 具体产品类2classConcreteProduct2:publicProduct{public:std::stringOperation()constoverride{return{Result of the ConcreteProduct2};}};// 工厂类classCreator{public:virtual~Creator(){};virtualProduct*FactoryMethod()const0;std::stringSomeOperation()const{Product*productthis-FactoryMethod();std::string resultCreator: The same creators code has just worked with product-Operation();deleteproduct;returnresult;}};// 具体工厂类1classConcreteCreator1:publicCreator{public:Product*FactoryMethod()constoverride{returnnewConcreteProduct1();}};// 具体工厂类2classConcreteCreator2:publicCreator{public:Product*FactoryMethod()constoverride{returnnewConcreteProduct2();}};定义提供一系列相关或相互依赖对象的接口多态对象而无需指定他们具体的类。适用性它提供了一种方式可以封装一组具有共同主题的单个工厂而无需指定它们的具体类。一个系统要由多个产品系列中的一个来配置时参与者AbstractFactory声明一个创建抽象产品对象的操作接口ConcreteFactory实现创建具体产品对象的操作AbstractProduct为一类产品对象声明一个接口ConcreteProduct定义一个将被相应的具体工厂创建的产品对象实现AbstractProduct接口client仅使用由AbstractFactory和AbstractProduct类声明的接口实现将工厂作为单例创建产品AbstractFactory仅声明一个创建产品的接口真正创建产品是由ConcreteProduct子类实现最通常的办法是为每一个产品定义一个工厂方法。Abstract Factory要求所有对象族系的生成函数都要集中于唯一接口。所以针对待生成物的每一个族系都必须为这一接口提供一份实作版本——使用场景一个系统要独立于它的产品的创建组合和表示时一个系统要由多个产品系列中的一个来配置时当你要强调一系列相关的产品对象的设计以便进行联合使用时——当你提供一个产品类库而只想显示它们的接口而不是实现时协作通常在运行时刻创建一个ConcreteFactory类的实例这一具体的工厂创建具有特定实现的产品对象。为创建不同的产品对象客户应使用不同的具体工厂优缺点优点分离了具体的类。Abstract Factory模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程它将客户与类的实现分离。使得易于交换产品系列有利于产品的一致性缺点对型别需求很强烈难以支持新种类的产品代码示例// 抽象产品A和BclassAbstractProductA{public:virtual~AbstractProductA(){};virtualstd::stringUsefulFunctionA()const0;};classAbstractProductB{public:virtual~AbstractProductB(){};virtualstd::stringUsefulFunctionB()const0;};// 具体产品A1和A2classConcreteProductA1:publicAbstractProductA{public:std::stringUsefulFunctionA()constoverride{returnThe result of the product A1.;}};classConcreteProductA2:publicAbstractProductA{public:std::stringUsefulFunctionA()constoverride{returnThe result of the product A2.;}};// 具体产品B1和B2classConcreteProductB1:publicAbstractProductB{public:std::stringUsefulFunctionB()constoverride{returnThe result of the product B1.;}};classConcreteProductB2:publicAbstractProductB{public:std::stringUsefulFunctionB()constoverride{returnThe result of the product B2.;}};// 抽象工厂classAbstractFactory{public:virtualAbstractProductA*CreateProductA()const0;virtualAbstractProductB*CreateProductB()const0;};// 具体工厂1classConcreteFactory1:publicAbstractFactory{public:AbstractProductA*CreateProductA()constoverride{returnnewConcreteProductA1();}AbstractProductB*CreateProductB()constoverride{returnnewConcreteProductB1();}};// 具体工厂2classConcreteFactory2:publicAbstractFactory{public:AbstractProductA*CreateProductA()constoverride{returnnewConcreteProductA2();}AbstractProductB*CreateProductB()constoverride{returnnewConcreteProductB2();}};这个例子中AbstractProductA和AbstractProductB是抽象产品ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和ConcreteProductB2是具体产品。AbstractFactory是抽象工厂定义了创建产品的方法ConcreteFactory1和ConcreteFactory2是具体工厂实现了创建产品的方法。使用抽象工厂模式可以将一组具有共同主题的单个工厂封装起来使得可以在运行时更换产品系列而客户端代码不需要进行修改。同时抽象工厂模式也可以约束客户端使用的产品确保这些产品是相互配合的。
返回列表