zoukankan      html  css  js  c++  java
  • 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 同时,如果新加一类产品族,需要构建相关的产品类和生产该产品的具体工厂类。

  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/yuboyue/p/2109880.html
Copyright © 2011-2022 走看看