zoukankan      html  css  js  c++  java
  • 抽象工厂模式(AbsFactory)C++实现

    模式意图:提供一个创建一系列相关或相互依赖对象的接口,二无需指定他们具体的类。

    效果:

    1. 分离了具体的类。     使  a.客户与类的实现分离  b.客户通过抽象接口操纵实例  c.产品的类名在实现中被分离
    2. 它使得易于交换产品系列。     我们仅需转换到相应的工厂对象并从新创建接口,就能交换产品系列 
    3. 有利于产品的一致性。  一个接口只能产生同一系列的对象
    4. 难以支持新种类的产品  因为接口确定了被创建的产品集合

    代码实例:

    头文件AbsDesk.h中定义了一个基类AbsDesk,和继承于它的两个类WoodDesk(代表过去用的桌) ,CreativeDesk (代表现在用的桌)

    #ifndef _ABSDESK_
    #define _ABSDESK_

    #include <string>
    using std::string;

    class AbsDesk{
    public:
    AbsDesk(string name, double price):_mName(name), _mPrice(price){}
    virtual void SetPrice(double price){_mPrice = price;}
    virtual double GetPrice(){return _mPrice;}
    string _mName;
    private:
    double _mPrice;
    };

    class WoodDesk : public AbsDesk{
    public:
    WoodDesk(double price, string shape)
    :AbsDesk("WoodDesk", price), _mShape(shape){}

    string _mShape;
    };

    class CreativeDesk : public AbsDesk{
    public:
    CreativeDesk(double price, string shape)
    :AbsDesk("CreativeDesk", price), _mShape(shape){}

    string _mShape;
    };

    #endif

    在头文件AbsBed.h中定义了基类AbsBed,和继承于它的WoodBed 、Simmons (分别代表过去和现代用的床)

    #ifndef _ABSBED_
    #define _ABSBED_

    #include <string>
    using std::string;

    class AbsBed{
    public:
    AbsBed(string name, double price):_mName(name), _mPrice(price){}
    virtual void SetPrice(double price){_mPrice = price;}
    virtual double GetPrice(){return _mPrice;}
    string _mName;
    private:
    double _mPrice;
    };

    class WoodBed : public AbsBed{
    public:
    WoodBed(double price, double len, double wid)
    :AbsBed("WoodBed", price), _mLength(len), _mWidth(wid){}

    double _mLength;
    double _mWidth;
    };

    class Simmons : public AbsBed{
    public:
    Simmons(double price, double len, double wid)
    :AbsBed("Simmons", price), _mLength(len), _mWidth(wid){}

    double _mLength;
    double _mWidth;
    };

    #endif

    在头文件AbsFactory中定义了基类AbsFactory,和BeforeFactory ,NowFactory (分别产生过去和现代用品)

    #ifndef _FACTORY_
    #define _FACTORY_
    #include "AbsBed.h"
    #include "AbsDesk.h"

    class AbsFactory{
    public:
    AbsFactory(){}
    virtual AbsDesk* MakeDesk(double price, string shape) const = 0;
    virtual AbsBed* MakeBed(double price, double len, double wid) const = 0;
    };

    class BeforeFactory : public AbsFactory{
    public:
    BeforeFactory(){}
    virtual AbsDesk* MakeDesk(double price, string shape) const
    {return new WoodDesk(price, shape);}

    virtual AbsBed* MakeBed(double price, double len, double wid) const
    {return new WoodBed(price, len, wid);}
    };

    class NowFactory : public AbsFactory{
    public:
    NowFactory(){}
    virtual AbsDesk* MakeDesk(double price, string shape) const
    {return new CreativeDesk(price, shape);}

    virtual AbsBed* MakeBed(double price, double len, double wid) const
    {return new Simmons(price, len, wid);}
    };


    #endif

    在main文件中:

    #include <iostream>
    #include <string>
    using namespace std;

    #include "AbsFactory.h"

    int main()
    {

    /////////////////////////////////////////////////////////////////////////用抽象工厂产生了过去用品
    AbsFactory* pFactory = new BeforeFactory;

    //效果1.这里客户调用函数实现类,分离了类的实现。因为调用的事函数,客户并不是的具体的类名。

    AbsBed* pBed = pFactory->MakeBed(100, 200, 180);
    AbsDesk* pDesk = pFactory->MakeDesk(100, "circle");

    //效果1.客户通过抽象接口操纵实例
    cout<<pBed->_mName<<endl;     //输出:WoodBed
    cout<<pDesk->_mName<<endl;    //输出: WoodDesk

    /////////////////////////////////////////////////////////////////////////

    //在不修改原代码的情况下添加了现代的Simmons和CreativeDesk //

    //使抽象工厂生产了现代系列产品,体现了效果2.易于交换系列产品 //

    /////////////////////////////////////////////////////////////////////////用抽象工厂产生了现代用品

    pFactory = new NowFactory;

    pBed = pFactory->MakeBed(100, 200, 180);
    pDesk = pFactory->MakeDesk(100, "circle");
    cout<<pBed->_mName<<endl;     //输出: Simmons
    cout<<pDesk->_mName<<endl;    //输出: CreativeDesk

    //////////////////////////////////////////////////////////////////////////

    //但是因为工厂接口已经确定了产品,在不改变接口代码的情况下难以//

    //在产生其它用品,如:凳子。这体现了效果4            //

    //效果3:一个应用只能使用同一个系列中的对象,所以有利于产品的//

    //一致性                           //

    //////////////////////////////////////////////////////////////////////////

    return 0;
    }

    结束!

  • 相关阅读:
    穿戴式眼镜显示屏方案
    centos8 shell脚本定时restart workerman问题
    cmake中文文档(一)-编译命令行工具
    Dear ImGui中文文档(一)
    PHP实现布隆过滤算法
    case when的记录
    前端的一些记录
    z-index 弹出元素被原本页面的元素遮挡住
    DevExpress 导出pdf中文不显示或者乱码问题
    DevExpress控件位置的微调
  • 原文地址:https://www.cnblogs.com/wrbxdj/p/4145976.html
Copyright © 2011-2022 走看看