Creational Pattern 之 Abstract Factory

啥时候你想到用Abstract Factory Pattern?

恩 ....

1 当你的系统需要独立于产品实体的如何被创建、如何被构成、如何被展现的时候,可以考虑使用Abstract Factory Pattern.

2 一个系统需要被配置成不同family的成品, 如界面风格,motif风格、mercury风格。

3 提供一套产品的库, 需要只对我提供构建产品的接口。

   具体一点,看下面这个实例,一个销售水果的系统,它不过水果是如何被采摘、如何包装、如何被封箱、如何贴标签,而只是将可以卖的成品放到柜台或者集市去销售.

   在这里, 我们设计销售水果的系统为类AutoSaleSystem.

class AutoSaleSystem{

public:

    void saleFruitToJapan() {

        Package* package = new JapanPackage();

        Product* productForSale = package->product();

    }

}

//包装: 标签 尺寸 加工工艺(罐头,干果,鲜果)等

class Package {

    virtual FruitProduct* produce() const;

}

class JapanPackage : public Package {

    FruitProduct* product() const {

        FruitProduct* product = new JapanFruitProduct ();

    }   

    virtual ~JapanPackage()  {}

}

class RussiaPackage : public Package {

    FruitProduct* product() const {

        FruitProduct* product = new RussiaFruitProduct ();

    } 

    virtual ~ RussiaPackage () {}

}

class FruitProduct {

public:

    virtual   string getLabel() const;

    virtual   unsigned int getSize() const;

private:

    string m_label;

    unsigned int m_size;

}

class JapanFruitProduct : public FruitProduct {

public:

    string getLabel() const {...}

    unsigned int getSize() const {...}

}

class RussiaFruitProduct : public FruitProduct {

public:

    string getLabel() const {...}

    unsigned int getSize() const {...}

}

Abstract Factory Pattern的利与弊哈:

1 对具体的实现类进行隔离:

    由于由具体的工厂来生产不同的产品,所以不同类型的产品不会混杂在一起。

2 用户不必了解产品的实现细节,而可以只关心接口。

3 在不同的产品族之间切换变得方便:如saleProduct(Package*), 通过为saleProduct传递不同的Package类型可以方便在Japan和Russia俩个产品族直接切换, 接口完全不用改变,改变的仅是在run-time时传什么具体的Package类。

4 同时,如果新加一类产品族,需要构建相关的产品类和生产该产品的具体工厂类。

posted @ 2011-07-18 18:46  yub0yue  阅读(166)  评论(0编辑  收藏  举报