工厂模式

本文通过示例代码详细介绍了工厂模式的基本概念及其应用场景,探讨了如何通过工厂模式解决父类实例化具体子类的问题,并讨论了该模式可能带来的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Factory模式

 

 

 

//Product.h

 

#ifndef _PRODUCT_H_

 

#define _PRODUCT_H_  

 

class Product

{

 

public:  

 

virtual ~Product() = 0;  

 

protected:  

 

Product();

 

};  

 

class ConcreteProduct:public Product

{

 

public:  

 

~ConcreteProduct();  

 

ConcreteProduct();    

 

};  

 

#endif

//Product.cpp  

 

#include"Product.h"

 

#include<iostream>

 

usingnamespace std;  

 

Product::Product()

{  

 

}  

 

Product::~Product()

{  

 

}  

 

ConcreteProduct::ConcreteProduct()

{  

 

cout<<"ConcreteProduct...."<<endl;

 

}  

 

ConcreteProduct::~ConcreteProduct()

{  

 

}

//Factory.h  

 

#ifndef _FACTORY_H_

 

#define _FACTORY_H_  

 

class Product;  

 

class Factory

{

 

public:  

 

         virtual~Factory() =0;  

 

         virtual Product* CreateProduct()= 0;  

 

protected:  

 

         Factory();  

 

};

 

class ConcreteFactory:public Factory

{

public:  

         ~ConcreteFactory(); 

 

         ConcreteFactory();  

 

         Product* CreateProduct();

 

};  

#endif

//Factory.cpp  

 

#include"Factory.h"

#include"Product.h"  

 

#include<iostream>

usingnamespace std;  

 

Factory::Factory()

{  

 

}  

 

Factory::~Factory()

{

 

}  

 

ConcreteFactory::ConcreteFactory()

{  

    cout<<"ConcreteFactory....."<<endl;

}  

 

ConcreteFactory::~ConcreteFactory()

{  

 

}  

 

Product* ConcreteFactory::CreateProduct()

{  

    returnnew ConcreteProduct();

}

 

//main.cpp  

 

#include"Factory.h"

#include"Product.h"

 

#include<iostream>

usingnamespace std;  

 

int main(int argc,char* argv[])

{  

    Factory* fac=new ConcreteFactory(); 

    Product* p=fac->CreateProduct();  

 

    return0;

}

代码说明

 

示例代码中给出的是 Factory模式解决父类中并不知道具体要实例化哪一个具体的子类

的问题,至于为创建对象提供接口问题,可以由 Factory中附加相应的创建操作例如

Create***Product()即可

Factory模式也带来至少以下两个问题:

    1)如果为每一个具体的 ConcreteProduct类的实例化提供一个函数体,那么我们可能不得不在系统中添加了一个方法来处理这个新建的 ConcreteProduct,这样 Factory 的接口永远就不肯能封闭(Close。当然我们可以通过创建一个 Factory的子类来通过多态实现这一点,但是这也是以新建一个类作为代价的。   2)在实现中我们可以通过参数化工厂方法,即给 FactoryMethod()传递一个参数用以决定是创建具体哪一个具体的 Product(实际上笔者在VisualCMCS中也正是这样做的)。当然也可以通过模板化避免 1)中的子类创建子类,其方法就是将具体 Product类作为模板参数,实现起来也很简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值