factory method的两种实现

// factory_method.cpp

#include <stdio.h>

#ifdef _X_RELEASE_
    #define TRACE(str)
#else
    #define TRACE(str) printf("%s/n", str)
#endif

// 产品抽象类,定义接口
class CProduct
{
public:
    CProduct()
    {
        TRACE("CProduct");
    }

    virtual ~CProduct()
    {
        TRACE("~CProduct");
    }

    virtual void Operation() = 0;
};

// 具体产品类
class CConcreteProduct : public CProduct
{
public:
    CConcreteProduct()
    {
        TRACE("CConcreteProduct");
    }

    virtual ~CConcreteProduct()
    {
        TRACE("~CConcreteProduct");
    }

    virtual void Operation()
    {
        TRACE("Operation");
    }
};

// 工厂方法抽象类,创建CProduct类型的产品
class CCreator
{
private:
    CProduct* m_pProduct;
   
public:
    CCreator()
    {
        TRACE("CCreator");
        m_pProduct = 0;
    }

    // m_pProduct在析构函数中释放
    virtual ~CCreator()
    {
        TRACE("~CCreator");
       
        if (m_pProduct)
        {
            delete m_pProduct;
            m_pProduct = 0;
        }
    }

    // FactoryMethod
    virtual CProduct *CreateProduct() = 0;

    CProduct* GetProduct()
    {
        TRACE("GetProduct");
       
        if (0 == m_pProduct)
        {
            m_pProduct = CreateProduct();
        }
       
        return m_pProduct;
    }
};

// 工厂方法具体类,创建CConcreteProduct类型的产品。一种具体产品类需要一个工厂方法具体类
class CConcreteCreator : public CCreator
{
public:
    CConcreteCreator()
    {
        TRACE("CConcreteCreator");
    }

    virtual ~CConcreteCreator()
    {
        TRACE("~CConcreteCreator");
    }

    // FactoryMethod
    virtual CProduct* CreateProduct()
    {
        TRACE("CreateProduct");
        return new CConcreteProduct();
    }
};

int main()
{
    CCreator* pCreator = new CConcreteCreator();
    if (!pCreator)
    {
        TRACE("error 1");
        return 1;
    }

    CProduct* pProduct = pCreator->GetProduct();
    if (!pProduct)
    {
        TRACE("error 2");
        return 2;
    }

    pProduct->Operation();

    delete pCreator;
    pCreator = 0;
   
    return 0;
}

/*
root@ubuntu:/home/hgc/test# g++ factory_method.cpp -o factory_method -g -Wall
root@ubuntu:/home/hgc/test# ./factory_method
CCreator
CConcreteCreator
GetProduct
CreateProduct
CProduct
CConcreteProduct
Operation
~CConcreteCreator
~CCreator
~CConcreteProduct
~CProduct
root@ubuntu:/home/hgc/test#
*/

 

 

// factory_method_template.cpp

#include <stdio.h>

#ifdef _X_RELEASE_
    #define TRACE(str)
#else
    #define TRACE(str) printf("%s/n", str)
#endif

// 产品抽象类,定义接口
class CProduct
{
public:
    CProduct()
    {
        TRACE("CProduct");
    }

    virtual ~CProduct()
    {
        TRACE("~CProduct");
    }

    virtual void Operation() = 0;
};

// 具体产品类
class CConcreteProduct : public CProduct
{
public:
    CConcreteProduct()
    {
        TRACE("CConcreteProduct");
    }

    virtual ~CConcreteProduct()
    {
        TRACE("~CConcreteProduct");
    }

    virtual void Operation()
    {
        TRACE("Operation");
    }
};

// 工厂方法抽象类
class CCreator
{
public:
    CCreator()
    {
        TRACE("CCreator");
    }

    virtual ~CCreator()
    {
        TRACE("~CCreator");
    }

    // FactoryMethod
    virtual CProduct* CreateProduct() = 0;
};

// 工厂方法类模板,构造CProduct的子类(TProduct)类型的产品
template <typename TProduct>
class CStandardCreator : public CCreator
{
public:
    CStandardCreator()
    {
        TRACE("CStandardCreator");
    }

    virtual ~CStandardCreator()
    {
        TRACE("~CStandardCreator");
    }

    // FactoryMethod
    virtual CProduct* CreateProduct();
};

template <typename TProduct>
CProduct* CStandardCreator<TProduct>::CreateProduct()
{
    return new TProduct();
}

int main()
{
    CStandardCreator<CConcreteProduct> concreteCreator;
   
    CProduct* pProduct = concreteCreator.CreateProduct();
    if (!pProduct)
    {
        TRACE("error 1");
        return 1;
    }

    pProduct->Operation();

    delete pProduct;
    pProduct = 0;

    return 0;
}

/*
root@ubuntu:/home/hgc/test# g++ factory_method_template.cpp -o factory_method_template -g -Wall
root@ubuntu:/home/hgc/test# ./factory_method_template
CCreator
CStandardCreator
CProduct
CConcreteProduct
Operation
~CConcreteProduct
~CProduct
~CStandardCreator
~CCreator
root@ubuntu:/home/hgc/test#
*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值