设计模式C++抽象工厂模式

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

1、AbstractFactory.h

#ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Item
{
protected:
    string caption;
public :
    Item(string s):caption(s){}
    virtual void makingLink()=0;
};

class Link:public Item
{
protected:
    string url;
public :
    Link(string c,string u):Item(c),url(u){}
};

class ListLink:public Link
{
public :
    ListLink(string c,string u):Link(c,u){}
    virtual void makingLink();
};

class Tray:public Item
{
protected:
    vector<Item*> v;
public :
    Tray(string s):Item(s){}
    void add(Item *item);
    void list();
};

class ListTray:public Tray
{
public :
    ListTray(string c):Tray(c){}
    virtual void makingLink();
};

class Factory
{
public :
    virtual Link* createLink(string c,string u)=0;
    virtual Tray* createTray(string c)=0;
};

class ListFactory:public Factory
{
public :
    virtual Link* createLink(string c,string u);
    virtual Tray* createTray(string c);
};

#endif

2、AbstractFactory.cpp

#include "AbstractFactory.h"

void ListLink::makingLink()
{
    cout<<"Link-->"<<caption<<"-->"<<url<<endl;
}

void Tray::add(Item *item)
{
    v.push_back(item);
}

Link* ListFactory::createLink(string c,string u)
{
    return new ListLink(c,u);
}

Tray* ListFactory::createTray(string c)
{
    return new ListTray(c);
}

void ListTray::makingLink()
{
    cout<<"ListTray-->"<<caption<<endl;
}

void Tray::list()
{
    int len=v.size();
    for(int i=0;i<len;i++){

        v[i]->makingLink(); } }

3、Client.cpp

#include <iostream>  

#include <string>
#include "AbstractFactory.h"

using namespace std;  


int main()  
{  
    Factory * f=new ListFactory();
    Link * link=f->createLink("zhongguo","hen wei da");
    Tray * tray=f->createTray("riben");
    tray->add(link);
    link->makingLink();
    tray->makingLink();

    tray->list();

    system("pause");  
    return 0;  
}  

你可能感兴趣的:(设计模式,C++,抽象工厂)