设计模式之(五、工厂方法模式)

时间:2022-10-02 16:19:11

2011年3月8日 星期二 〖农历 辛卯 免年 二月初四〗 晴
设计模式之五、工厂方法模式Factory Method
适用范围:
定义一个用于创建对象的接口,让子类去决定实例化哪一个对象。
例如:运算操作实例。
我们可以在具体的每一个实现工厂中去决定,实例化哪一个操作,即加法?减法?乘法运算?
工厂方法模式与简单工厂模式的区别:
简单工厂模式最大的优点在于,工厂类中饮食了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式的结构图
设计模式之(五、工厂方法模式)

C++关键代码如下:
1、接口类:IProduct
提供纯虚函数:
virtual void Operation() = 0;

2、具体的实现类:CConcreteProduct.cpp
void CConcreteProduct::Operation()
{
    printf("A Operation~");
}

3、工厂接口类IFactory
提供纯虚函数
virtaul CProduct *CreateFactory() = 0;

4、工厂具体实现类:CConcreteFactory.cpp
CProduct *CConcreteFactory::CreateFactory()
{
    return new CConcreteFactory();
}

5、客户端代码:main.cpp
IFactory *fac = new CConcreteFactory();
IProductv *pro = fac->CreateFactory();
pro->Operation();

 

if ( fac != NULL)

{

   delete fac;

}

 

if ( pro != NULL )

{

   delete pro;

}

实例:运算操作利用工厂方法模式来实现。
工厂方法模式结构图如下:
设计模式之(五、工厂方法模式)

C++关键代码如下:
1、运算类接口:IOperation
提供了一个纯虚函数:
public:
virtual double GetResult() = 0;
protected:
    double m_num1;
    double m_num2;

IOperation.cpp
void IOperation::SetNumber(double num1, double num2)
{
    m_num1 = num1;
    m_num2 = num2;
}

2、具体的运算子类,加法运算:CAdd.cpp
double CAdd::GetResult()
{
    return m_num1 + m_num2;
}

3、具体的运算子类,减法运算:CSub.cpp
double CSub::GetResult()
{
    return m_num1 - m_num2;
}
4、其它类似,不重复。
...

5、工厂类接口:IFactory
提供了纯虚函数
virtual IOperation *CreateFactory() = 0;
6、具体的子工厂类,加法工厂:CAddFactory.cpp
IOperation *CAddFactory::CreateFactory()
{
    return new CAdd();
}
7、具体的子工厂类,减法工厂:CSubFactory.cpp
IOperation *CSubFactory::CreateFactory()
{
    return new CSub();
}
8、其它工厂类类似,不重复。
....

9、客户端实现main.cpp
IFactory *fac = new CAddFactory();
IOperation *oper = fac->CreateFactory();
oper->SetNumber(1,2);
cout<<"加法运算结果:"<GetResult()<
IFactory *fac1 = new CSubFactory();
IOperation *oper1 = fac1->CreateFactory();
oper1->SetNumber(1,2);
cout<<"减法运算结果:"<GetResult()<

 

//释放内存

if(fac != NULL)

{

   delete fac;

}

 

if (oper != NULL)

{

   delete oper;

}

 

if( fac1 != NULL)

{

   delete fac1;

}

 

if(oper1 != NULL)

{

   delete oper1;

}
以上。