您的位置:首页 > 编程语言 > C语言/C++

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

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

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

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

       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,而返回的是指向具体产品的指针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息