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

  • 相关阅读:
    selenium Grid2 分布式自动化测试环境搭建
    Python Appium 开启Android测试之路
    C#导出数据到CSV和EXCEL文件时数字文本被转义的解决方法
    浅谈 DML、DDL、DCL的区别
    让EntityFramework6支持SQLite
    System.Drawing.Color的颜色对照表
    清除远程桌面连接记录和SQLSERVER 连接记录的办法
    Jquery操作select选项集合!
    asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文件接口
    Log4net 根据日志类别保存到不同的文件,并按照日期生成不同文件名称
  • 原文地址:https://www.cnblogs.com/yuboyue/p/2109880.html
Copyright © 2020-2023  润新知