当前位置:编程学习 > C/C++ >>

工厂方法

工厂方法,跟抽象工厂、建造者模式等解决的问题都类似,通过将产品和其实现分离,达到了客户和具体产品之间的解耦。
 
工厂方法,其精髓就是他名字本身,在工厂类中提供一个工厂方法,该方法返回具体的产品。客户只需要关注该产品的接口(一般是抽象父类),而无需关注起具体实现和创建过程。
 
工厂方法的一个缺点是客户可能仅仅为了穿件一个具体的产品,需要增加creator的一个子类。一般通过c++的模板方法可以解决这个问题。
 
下面是一个简单的例子,还是生产pc和pad的一个工厂。
 
 
/** 
 * @file test_factory_method.cpp 
 * @author itegel 
 * @date 2013/09/16 10:50:40 
 * @brief 还是生产电脑的问题 
 *   
 **/  
  
#include <iostream>  
#include <string>  
using namespace std;  
  
//product  
class Computer{  
public:  
    Computer(){}  
    ~Computer(){}  
    virtual void WhoIam(){   
        cout<<"Computer!"<<endl;  
    }  
    virtual void Compute(string expr){  
        cout<<"computing "<<expr<<"..."<<endl;  
    }  
      
    virtual void Display(string content){  
        cout<<"Display: "<<content<<endl;  
    }  
};  
  
class PC: public Computer{  
public:  
    PC(){}  
    ~PC(){}  
    virtual void WhoIam(){  
        cout<<"PC!"<<endl;  
    }  
    virtual void Compute(string expr){  
        cout<<"PC computing "<<expr<<"... used 0.0000001ms"<<endl;  
    }  
};  
  
class IPad: public Computer{  
    public:  
    IPad(){}  
    ~IPad(){}  
    virtual void WhoIam(){  
        cout<<"IPad!"<<endl;  
    }  
    virtual void Compute(string expr){  
        cout<<"IPad conputing "<<expr<<"... used 0.001ms"<<endl;  
    }  
} ;  
  
//factory, so 易做图, no extention is implemented  
template <class T>  
class Creator{  
public:  
    Creator(){}  
    ~Creator(){}  
    //factory method  
    virtual T * CreateComputer(){  
        return new T();  
    }  
  
  
};  
  
  
//client  
int main(){  
    Computer * computer = NULL;  
  
    //PC  
    cout<<"start produce pc and do some job!"<<endl;  
    Creator<PC> *creator = new Creator<PC>();  
    computer = creator->CreateComputer();  
    computer->WhoIam();  
    computer->Compute("1+1=");  
    computer->Display("2");  
    delete creator;  
    delete computer;  
  
    //IPad  
    cout<<endl<<"start produce IPad and do some job!"<<endl;  
    Creator<IPad> *creator2 = new Creator<IPad>();  
    computer = creator2->CreateComputer();  
    computer->WhoIam();  
    computer->Compute("1+1=");  
    computer->Display("2");  
    delete computer;  
  
    return 0;  
}  

 

   
 
运行结果如下:
 
start produce pc and do some job!  
PC!  
PC computing 1+1=... used 0.0000001ms  
Display: 2  
  
start produce IPad and do some job!  
IPad!  
IPad conputing 1+1=... used 0.001ms  
Display: 2  

 

 
从效果看,工厂方法的引入,使得产品的具体创建过程对客户封闭,而对于具体产品的扩展却是开放的。用户想增加一个产品,只需要从product抽象类继承一个子类出来,并实现其接口即可。
 
抽象工厂,抽象方法和构造器都是创建型模型中使用非常多的,也是面向对象设计中最基本的几种模式。要解决的问题均相似,只是在应用场景上稍有差别。很多时候这几个还交叉使用。比如抽象工厂中,也可以通过工厂方法或建造者,获取具体产品。而建造者只是更关注产品的组装过程,产品的单个部分的创建也可以使用其他模式生成。
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,