设计模式之工厂方法模式

一、 模式定义

Define an interface for creating an object, but let subclasses decide which class to instantiate.
Factory Method lets a class defer instantiation to subclasses.
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

二、 特点

  • 良好的封装性,代码结构清晰。只需要知道创建的产品类,而无需了解创建对象的具体过程,降低模块间的耦合
  • 扩展性优秀。如果需要新增加产品类,只需要适当修改工厂类并扩展一个产品类即可,在 “拥抱变化” 上,其具有很实用的意义。
  • 屏蔽了产品类,其是一个典型的解耦框架。高层模块只需要知道产品的抽象类,即可对产品进行使用。工厂方法符合迪米特法则、符合依赖倒置原则以及里氏替换原则。

三、 工厂方法模式示例代码

/*****************************************************************
 * Copyright (c) Bingwu 2019. All rights reserved.
 * Filename   : FactoryPattern.cpp
 * Description: 工厂方法模式
 * Author     : Bingwu
 * Create time: 2019-07-01 08:40:33
 * Last time  : 2019-07-01 11:37:46
 * Blog       : https://blog.csdn.net/AloneFar
 * Motto      : 齐烟九点   意尽天明
 *****************************************************************/

#include <iostream>

typedef enum _human_type_e
{
    E_HUMAN_BLACK = 0,
    E_HUMAN_WHITE,
    E_HUMAN_YELLOW,
}HUMAN_TYPE_E;

class CHuman
{
public:
    CHuman() {}
    virtual ~CHuman() {}
    virtual void Speak() = 0;
};

class CBlackMan:public CHuman
{
public:
    CBlackMan() {}
    ~CBlackMan() {}

    void Speak() { std::cout << "我是黑种人" << std::endl; }
};

class CWhiteMan:public CHuman
{
public:
    CWhiteMan() {}
    ~CWhiteMan() {}

    void Speak() { std::cout << "我是白种人" << std::endl; }
};

class CYellowMan:public CHuman
{
public:
    CYellowMan() {}
    ~CYellowMan() {}

    void Speak() { std::cout << "我是黄种人" << std::endl; }
};

class CHumanFactory
{
public:
    CHumanFactory() {}
    ~CHumanFactory() {}
    CHuman * CreateHuman(HUMAN_TYPE_E eHumanType);
};

/*****************************************************************
 * Function   : CHuman * CreateHuman(HUMAN_TYPE_E eHumanType)
 * Description: 根据传入得类型创建对应的人类肤色实体
 * Param      : eHumanType - 肤色类型 HUMAN_TYPE_E
 * Return     : 对应肤色实体
 * Create time: 2019-07-01 11:19:18
 *****************************************************************/
CHuman * CHumanFactory::CreateHuman(HUMAN_TYPE_E eHumanType)
{
    CHuman * pHuman = NULL;
    switch (eHumanType)
    {
        case E_HUMAN_BLACK:
        {
            pHuman = new CBlackMan();
            break;
        }
        case E_HUMAN_WHITE:
        {
            pHuman = new CWhiteMan();
            break;
        }
        case E_HUMAN_YELLOW:
        {
            pHuman = new CYellowMan();
            break;
        }
        default:
            break;
    }

    return pHuman;
}

class CNvWa
{
public:
    CNvWa() { m_HumanFactory = NULL; }
    ~CNvWa() {}

    bool CreateYinYangLu() 
    {
        m_HumanFactory = new CHumanFactory();
        return (NULL == m_HumanFactory) ? false : true;
    }
    CHuman * CreateHuman(HUMAN_TYPE_E eHumanType)
    {
        if (NULL == m_HumanFactory)
        {
            return NULL;
        }

        return m_HumanFactory->CreateHuman(eHumanType);
    }
private:
    CHumanFactory * m_HumanFactory;
};

int main()
{
    CNvWa * pNvWa = new CNvWa();
    if (NULL == pNvWa)
    {
        exit(-1);
    }
    
    if (!pNvWa->CreateYinYangLu())
    {
        std::cout << "女娲创建阴阳八卦炉失败" << std::endl;
        exit(-1);
    }
    else
    {
        std::cout << "女娲创建阴阳八卦炉成功" << std::endl;
    }

    CHuman * pPeople1 = pNvWa->CreateHuman(E_HUMAN_BLACK);
    CHuman * pPeople2 = pNvWa->CreateHuman(E_HUMAN_WHITE);
    CHuman * pPeople3 = pNvWa->CreateHuman(E_HUMAN_YELLOW);

    pPeople1->Speak();
    pPeople2->Speak();
    pPeople3->Speak();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值