c++设计模式之简单工厂模式

      对于一个程序员来说,好的程序架构不仅可以使代码看上去简洁清晰,而且能够提高代码的可维护性,一个好的程序架构往往能够起到事半功倍的效果。设计模式就是前人累积下来的智慧的精华,是搭建良好的程序框架的基石。在此我首先介绍一种最简单但也是非常常用的一种设计模式,简单工厂 模式。在之后的文章中我会去讨论更多的设计模式。

        工厂模式:工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂类方法把实例化推延到子类。工厂类是一种使用非常普遍的设计模式。

       工厂模式包含的角色及职责:

       1.工厂(Creator)角色

           简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

       2.抽象产品(Product)角色

          简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

      3.具体产品(Concrete Product)角色

         是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

     简单工厂模式的优点:

     工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责消费对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。

    简单工厂模式的缺点:

    由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。

   

    以下是我写的一个关于简单工厂模式实例的一部分代码:

    首先介绍抽象产品角色:

    class Pizza
   {
      public:
           Pizza();
           virtual ~Pizza();
           virtual void PizzTaste(void)=0;
   };

    它是所有具体产品的基类,负责描述所有实例所共有的公共接口,所有的具体产品都要继承这个类。


    其次是具体产品角色:

class CBarbecue : public Pizza
{
public:
    CBarbecue();
    virtual void PizzTaste();
};

void CBarbecue::PizzTaste()
{
    std::cout<<"This is a barbecue taste pizza"<<endl;//这里是具体实现你的处理逻辑。
}

    这里只是一个具体的产品,如果有多个,随时可以进行扩展。


   最后介绍工厂角色:

   

class Factory
{
public:
    Factory();
    Pizza *getFactory(int iCMD);
private:
    Pizza *pFactory;
    vector<Pizza *>m_obj;
};

Pizza *Factory::getFactory(int iCMD) {
    switch((iCMD&0xff))
    {
       case 0xff:
       {
        if(!m_obj.at(0))
        {
            m_obj.at(0) = new CBarbecue();
        }
        pFactory = m_obj.at(0);
       }break;
       case 0xfe:
       {
        if(!m_obj.at(1))
        {
            m_obj.at(1) = new Cchicken();
        }
        pFactory = m_obj.at(1);
       }break;
       case 0xfd:
       {
        if(!m_obj.at(2))
        {
            m_obj.at(2) = new Cbeef();
        }
        pFactory = m_obj.at(2);
       }break;
       default:
       {
           pFactory = NULL;
       }break;
    }
    return pFactory;
}
    

   在这里根据具体的条件获取具体的实例,具体的条件是iCMD,而返回的是指向具体产品的指针




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值