欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式学习笔记:factory method(工厂方法)

程序员文章站 2023-08-18 17:39:56
工厂方法是一种对象创建型模式,它的目的是定义一个用于创建对象的接口,让子类决定实例化哪一个类,可以使一个类的实例化延迟到子类。 适用场景    &...
工厂方法是一种对象创建型模式,它的目的是定义一个用于创建对象的接口,让子类决定实例化哪一个类,可以使一个类的实例化延迟到子类。
适用场景
        工厂方法适用于一下几种情况:
        1)当一个类不知道它所必须创建的对象的类的时候;
        2)当一个类希望由它的子类来指定它所创建的对象的时候;
        3)当类将创建对象的职责委托给多个帮助子类中的一个;
模式结构
        下面我们来看一下工厂方法的模式结构以便对其有一个全局的了解,如图所示:

设计模式学习笔记:factory method(工厂方法)

参与者

        很显然,从上面的模式结构中我们可以看出工厂方法主要有4个主要参与者。

        1)product

        定义工厂方法所创建对象的接口。

        2)concreteproduct

        实现对象创建的接口。

        3)creator

        声明工厂方法以返回product对象,也可以定义缺省的实现,返回一个缺省的concreteproduct对象,另外在creator中也可以调用工厂方法以创建一个product对象,稍后在代码中有体现,具体主要getproduct()方法和createproduct()方法。

        4)concretecreator

        重定义createproduct()方法返回一个具体的concreteproduct实例。

        另外,creator如果想创建一个具体的concreteproduct实例,则依赖于它的子类,如concretecreator,这样就造成一个潜在的问题--可能仅为了创建适当的product对象而*创建creator类的子类,在c++中的一种解决方案是使用模板。

实现

        下面通过代码实现上述工厂方法,类中具体的操作与上图有出入,主要为体现这种思想--延迟创建。

        首先是各类的声明以及继承体系:


[cpp] //factory.h  
#ifndef factory_h  
#define factory_h  
 
class product 

}; 
 
class creator 

public: 
    creator():m_pproduct(nullptr){}; 
    product* getproduct(); 
    virtual product* createproduct()=0; 
private: 
    product *m_pproduct; 
}; 
 
/*针对上述潜在问题,这里提供一种解决方案
 *1)提供一个creator类的模板子类,用product类作为模板参数
 *2)这样做可以减少类的创建
 */ 
   
template <class theproduct> 
class standardcreator:public creator 

public: 
    virtual product* createproduct(); 
}; 
                                                                  
template <typename theproduct> 
product* standardcreator<theproduct>::createproduct() 

    return new theproduct(); 

#endif 
//factory.h
#ifndef factory_h
#define factory_h

class product
{
};

class creator
{
public:
    creator():m_pproduct(nullptr){};
    product* getproduct();
    virtual product* createproduct()=0;
private:
    product *m_pproduct;
};

/*针对上述潜在问题,这里提供一种解决方案
 *1)提供一个creator类的模板子类,用product类作为模板参数
 *2)这样做可以减少类的创建
 */
 
template <class theproduct>
class standardcreator:public creator
{
public:
    virtual product* createproduct();
};
                                                                
template <typename theproduct>
product* standardcreator<theproduct>::createproduct()
{
    return new theproduct();
}
#endif
 

然后是简单的实现:

[cpp] //factory.cpp  
#include "factory.h"  
#include <iostream>  
 
using namespace std; 
 
product* creator::getproduct() 

    if (nullptr == m_pproduct) 
    { 
        m_pproduct = createproduct(); 
    } 
    return m_pproduct; 

//factory.cpp
#include "factory.h"
#include <iostream>

using namespace std;

product* creator::getproduct()
{
    if (nullptr == m_pproduct)
    {
        m_pproduct = createproduct();
    }
    return m_pproduct;
}

 

最后是测试代码:


[cpp] //test.cpp  
#include "factory.h"  
#include <iostream>  
 
using namespace std; 
 
//客户只需提供不同的产品类,便可以使用统一的方法创建产品。  
class myproduct:public product 

public: 
    myproduct() 
    { 
        cout << "myproduct has been constructed!" << endl; 
    } 
}; 
 
class yourproduct:public product 

public: 
    yourproduct() 
    { 
        cout << "yourproduct has been constructed!" << endl; 
    } 
}; 
 
class ourproduct:public product 

public: 
    ourproduct() 
    { 
        cout << "ourproduct has been constructed!" << endl; 
    } 
}; 
 
int main() 

    standardcreator<ourproduct> ourcreator; 
    product *pproduct = ourcreator.getproduct(); 
    standardcreator<myproduct> mycreator; 
    pproduct = mycreator.getproduct(); 
    standardcreator<yourproduct> yourcreator; 
    pproduct = yourcreator.getproduct(); 
 
    char ch = getchar(); 
    return 1; 

//test.cpp
#include "factory.h"
#include <iostream>

using namespace std;

//客户只需提供不同的产品类,便可以使用统一的方法创建产品。
class myproduct:public product
{
public:
    myproduct()
    {
        cout << "myproduct has been constructed!" << endl;
    }
};

class yourproduct:public product
{
public:
    yourproduct()
    {
        cout << "yourproduct has been constructed!" << endl;
    }
};

class ourproduct:public product
{
public:
    ourproduct()
    {
        cout << "ourproduct has been constructed!" << endl;
    }
};

int main()
{
    standardcreator<ourproduct> ourcreator;
    product *pproduct = ourcreator.getproduct();
    standardcreator<myproduct> mycreator;
    pproduct = mycreator.getproduct();
    standardcreator<yourproduct> yourcreator;
    pproduct = yourcreator.getproduct();

    char ch = getchar();
    return 1;
}

 

下面是测试效果:www.2cto.com

 设计模式学习笔记:factory method(工厂方法)

摘自 arvon zhang的专栏