码迷,mamicode.com
首页 > 其他好文 > 详细

【设计模式】抽象工厂模式

时间:2014-07-29 13:00:36      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   使用   os   io   2014   

抽象工厂模式是工厂方法模式的进一步强化。当工厂函数只需要产生一种类型的产品(所有产品都继承自同一抽象基类时,使用工厂方法模式即可。但是,当用户程序需要创建多种类型的产品,而这些产品又有一定的内在联系,那么就要用到抽象工厂模式了。抽象工厂模式的UML图如下所示:

bubuko.com,布布扣


AbstractProductA和AbstractProductB是两种不同类型的抽象产品,每种类中的抽象下面又有两种不同类型的实现。两个具体的工厂ConcreteFactory1和ConcreteFactory2负责生产每种抽象产品下的一个具体产品。这样的关系看起来比较复杂,下面通过一个例子来说明。一下是用C++编写的模拟抽象工厂模式的例子。

#include <iostream>
#include <string>
 
using namespace std;
 
// 笔记本抽象类
class Notebook {
public:
    // 所有笔记本拥有的共同接口
    virtual void Work() = 0;
};
 
// 华硕笔记本具体类
class ASUSNotebook : public Notebook {
public:
    void Work()
    {
        cout << "ASUS notebook working..." << endl;
    }
};
 
// 联想笔记本具体类
class LenovoNotebook : public Notebook {
public:
    void Work()
    {
        cout << "Lenovo notebook working..." << endl;
    }
};
 
// 台式机抽象类
class Desktop {
public:
    // 所有台式机拥有的共同接口
    virtual void Work() = 0;
};
 
// 华硕台式机具体类
class ASUSDesktop : public Desktop {
public:
    void Work()
    {
        cout << "ASUS desktop working..." << endl;
    }
};
 
// 联想台式机具体类
class LenovoDesktop : public Desktop {
public:
    void Work()
    {
        cout << "Lenovo desktop working..." << endl;
    }
};
 
// 抽象工厂
class AbstractFactory {
public:
    virtual Notebook* CreateNotebook() = 0; // 生产台式机的接口
    virtual Desktop* CreateDesktop() = 0;   // 生产笔记本的接口
};
 
// 华硕工厂
class FactoryOfASUS : public AbstractFactory {
public:
    // 华硕生产的笔记本
    Notebook* CreateNotebook()
    {
        return new ASUSNotebook();
    }
 
    // 华硕生产的台式机
    Desktop* CreateDesktop()
    {
        return new ASUSDesktop();
    }
};
 
// 联想工厂
class FactoryOfLenovo : public AbstractFactory {
public:
    // 联想生产的台式机
    Notebook* CreateNotebook()
    {
        return new LenovoNotebook();
    }
 
    // 联想生产的笔记本
    Desktop* CreateDesktop()
    {
        return new LenovoDesktop();
    }
};
 
int main()
{
    // 注意,用户只拥有抽象接口
    AbstractFactory *factory = new FactoryOfASUS(); // 实例化生产华硕电脑的工厂
    //AbstractFactory *factory = new FactoryOfLenovo(); // 实例化生产联想电脑的工厂
 
    // 抽象产品类,不同的品牌是通过多态性质体现的
    Notebook *myNotebook;
    Desktop *myDesktop;
 
    myNotebook = factory->CreateNotebook();
    myDesktop = factory->CreateDesktop();
 
    myNotebook->Work();
    myDesktop->Work();
 
    // 别忘了删除指针
    delete factory;
    delete myNotebook;
    delete myDesktop;
 
    system("pause");
    return 0;
}

运行结果:

bubuko.com,布布扣

在这个例子中,有两类抽象产品:笔记本Notebook和台式机Desktop。在它们下面又对应了具体的品牌。究竟产生哪类品牌的电脑是由具体的工厂对象完成的。对于用户代码而言,它们只需要实例化具体品牌的工厂,然后通过工厂产生Notebook和Desktop对象即可。当用户需要更换品牌时,只需要修改第97、99两行代码即可,如下所示:

//AbstractFactory *factory = new FactoryOfASUS();   // 实例化生产华硕电脑的工厂
AbstractFactory *factory = new FactoryOfLenovo();   // 实例化生产联想电脑的工厂

修改后的运行结果:
bubuko.com,布布扣

抽象工厂模式的优点就是便于交换产品系列。在上面的例子中,只需要修改一处用户代码便可以更换整个电脑产品系列的品牌。其次,用户代码包含的都是指向抽象基类的指针,具体的产品通过多态性加以区别,这使得用户代码依赖于抽象接口而不依赖于具体的类,增加了代码的灵活度。

参考:

《大话设计模式》第15章

【设计模式】抽象工厂模式,布布扣,bubuko.com

【设计模式】抽象工厂模式

标签:des   style   blog   http   使用   os   io   2014   

原文地址:http://blog.csdn.net/nestler/article/details/38261503

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!