• 【设计模式】工厂方法模式


    工厂方法模式

    /************************************************************************
    设计模式
    工厂方法模式
    
    在简单工厂里,工厂类的职责是根据不同的输入去实例化不同的类对象(实例化不同
    类对象的代码是在一个工厂类中),作为客户端来说,所要做的就是根据需要来为
    简单工厂传递不同的参数,当有新的需求增加时,需要再增加一个功能类的同时,
    需要去修改简单工厂总根据输入实例化不同类的代码,在之前说过,这违反了开闭原则,
    就是多当要扩展了时必须要修改代码。  在工厂类中一般是在其构造函数中实例化不同
    的功能类。
    
    在工厂方式模式中,两次用到了多态机制。
    工厂方法模式中,有一个工厂类的(抽象)基类,工厂基类的每个子类的作用是实例化
    不同的功能类(对象), 一个功能类对应一个工厂子类,一一对应,每个工厂类需要
    继承重写的(虚)方法用来创建不同的功能类对象。 这一点也不同于简单工厂模式中的
    在其构造函数中实例化不同类对象。
    客户端根据需要去实例化不同的工厂子类,其返回值赋给工厂(抽象)父类对象(多态1),
    然后该工厂(抽象)父类对象去调用创建(实例化)功能类对象的方法,将其返回值赋值给
    功能类(抽象)父类对象(多态2),然后用该功能类(抽象)父类对象去调用相应的(虚)函数。
    从而完成不同的操作。
    
    ************************************************************************/

    本例以女娲娘娘造人为例,这个创意是从别处看来的,没体具体看人家的代码,觉得这个例子的创意很好,觉得很有意思,于是就拿过来一用。

    前面所述,一个工厂子类对应一个功能子类,其功能仅仅是用来实例化相应的功能子类。

    这里的工厂父类是INvWaFactory,女娲娘娘工厂,因为功能类的抽象基类是IHuman(人类),人类有三个子类(白人、黑人、黄人),因此女娲娘娘工厂父类也有三个工厂子类,其作用是分别实例化白人类、黑人类、黄人类。

    在女娲娘娘工厂类继承体系中,有一个虚函数CreateInstance,这个虚函数用来实例化不同的人类子类,并且返回人类抽象基类的指针。

    两次多态:①根据需要去实例化不同的工厂子类,将该工厂子类指针赋值给女娲娘娘工厂抽象基类指针,然后用此指针去调用相应的CreateInstance虚函数。

    ②将CreateInstance虚函数的返回值赋值给IHuman人类类抽象基类指针,用此指针去调用IHuman人类继承体系中的ShowSkin虚函数。

    //人类 类,抽象基类
    class IHuman  
    {
    public: 
        IHuman();
        virtual ~IHuman();
        virtual void ShowSkin() const = 0; //显示肤色
    };
    
    IHuman::IHuman(){}
    IHuman::~IHuman(){}
    void IHuman::ShowSkin() const {}
    
    //////////////////////////////////////////////////////////////////////////
    
    //白人类
    class White : public IHuman
    {
    public:
        White();
        virtual ~White();
        virtual void ShowSkin() const;
    };
    
    White::White(){}
    White::~White(){}
    void White::ShowSkin() const
    {
        cout << "我是白人,我的肤色是白色!
    ";
    }
    
    //////////////////////////////////////////////////////////////////////////
    
    //黑人类
    class Black : public IHuman
    {
    public:
        Black();
        virtual ~Black();
        virtual void ShowSkin() const;
    };
    
    Black::Black(){}
    Black::~Black(){}
    void Black::ShowSkin() const
    {
        cout << "我是黑人,我的肤色是黑色
    ";
    }
    
    //////////////////////////////////////////////////////////////////////////
    
    //黄人类
    class Yellow : public IHuman
    {
    public:
        Yellow();
        virtual ~Yellow();
        virtual void ShowSkin() const;
    };
    
    Yellow::Yellow(){}
    Yellow::~Yellow(){}
    void Yellow::ShowSkin() const
    {
        cout << "我是黄种人,我的肤色是黄色
    ";
    }
    
    //////////////////////////////////////////////////////////////////////////

    下面是工厂类继承结构

    class INvWaFactory         //女娲工厂抽象基类
    {
    public:
        INvWaFactory();
        virtual ~INvWaFactory();
        virtual IHuman* CreateInstance() = 0; //创建不同的功能子类
    
    
    protected:
        IHuman* m_ptrHuman;
    };
    
    INvWaFactory::INvWaFactory() { m_ptrHuman = NULL;}
    INvWaFactory::~INvWaFactory(){ }
    IHuman* INvWaFactory::CreateInstance() {return NULL;}
    
    
    
    //////////////////////////////////////////////////////////////////////////
    
    //造白人类
    class CMakeWhite : public INvWaFactory
    {
    public:
        CMakeWhite();
        virtual ~CMakeWhite();
        virtual IHuman* CreateInstance() ;
    };
     
    CMakeWhite::CMakeWhite(){}
    CMakeWhite::~CMakeWhite(){delete m_ptrHuman;}
    IHuman* CMakeWhite::CreateInstance()  
    {
        return (m_ptrHuman = new White());
    }
    
    ////////////////////////////////////////////////////////////////////////////
    
    //造黑人类
    class CMakeBlack : public INvWaFactory
    {
    public:
        CMakeBlack();
        virtual ~CMakeBlack();
        virtual IHuman* CreateInstance();
    
    };
    
    CMakeBlack::CMakeBlack(){}
    CMakeBlack::~CMakeBlack(){delete m_ptrHuman;}
    IHuman* CMakeBlack::CreateInstance()
    {
        return (m_ptrHuman = new Black());
    }
    
    //////////////////////////////////////////////////////////////////////////
    
    //造黄种人
    class CMakeYellow : public INvWaFactory
    {
    public: 
        CMakeYellow();
        virtual ~CMakeYellow();
        virtual IHuman* CreateInstance();
    };
    
    CMakeYellow::CMakeYellow(){}
    CMakeYellow::~CMakeYellow(){delete m_ptrHuman;}
    IHuman* CMakeYellow::CreateInstance()
    {
        return (m_ptrHuman = new Yellow());
    }

    main函数及执行结果

    int _tmain(int argc, _TCHAR* argv[])
    {
        INvWaFactory* pNvwaFactor = new CMakeWhite();
        IHuman* pHuman = pNvwaFactor->CreateInstance();
        pHuman->ShowSkin();
        delete pNvwaFactor;
    
        cout<<endl;
    
        pNvwaFactor = new CMakeBlack();
        pHuman = pNvwaFactor->CreateInstance();
        pHuman->ShowSkin();
        delete pNvwaFactor;
    
        cout<<endl;
    
        pNvwaFactor = new CMakeYellow();
        pHuman = pNvwaFactor->CreateInstance();
        pHuman->ShowSkin();
        delete pNvwaFactor;
    
    
    
        cout<<endl<<endl;
        return 0;
    }

      

  • 相关阅读:
    严格模式
    es6模块与 commonJS规范的区别
    Javascript内置对象、原生对象、宿主对象关系
    实现继承的几种方式
    创建对象的一些方式
    null的小扩展
    getElementById的缩略
    你真的知道为什么不推荐使用@import?
    换行与不换行
    transition与animation
  • 原文地址:https://www.cnblogs.com/cuish/p/3737871.html
Copyright © 2020-2023  润新知