美文网首页
工厂方法

工厂方法

作者: szn好色仙人 | 来源:发表于2019-03-17 18:34 被阅读0次

    动机

    • 在软件系统中,经常面临着创建对象的工作,由于需求的变化,需要创建的对象的具体类型经常变化

    定义

    • 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类

    要点

    • 工厂方法模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合(new)会导致软件的脆弱
    • 工厂方法通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系
    • 工厂方法模式解决单个对象的需求变化,缺点在于要求创建方法参数相同

    示例

    #include <cstdio>
    
    
    //业务类的基类
    class CBase
    {
    public:
        virtual ~CBase(){}
        virtual void Print() = 0;
    };
    
    //具体业务类0
    class CChild0 : public CBase
    {
    public:
        virtual void Print() { printf("Type0\n"); }
    };
    
    //具体业务类1
    class CChild1 : public CBase
    {
    public:
        virtual void Print() { printf("Type1\n"); }
    };
    
    
    //工厂基类
    class CFactory
    {
    public:
        virtual ~CFactory() {}
        virtual CBase* Create() = 0;
    };
    
    //具体业务类0对应的工厂
    class CFactoryType_0 : public CFactory
    {
    public:
        CBase* Create() { return new CChild0; }
    };
    
    //具体业务类1对应的工厂
    class CFactoryType_1 : public CFactory
    {
    public:
        CBase* Create() { return new CChild1; }
    };
    
    
    //业务处理类
    class CMakeCar
    {
    public:
        CMakeCar() : pFactory_(nullptr) {}
    
        void SetFactory(CFactory* pFactory) { this->pFactory_ = pFactory; }
    
        void Deal() 
        { 
            //工厂的核心就是对此处进行解耦
            auto p = pFactory_->Create();
            p->Print();
            delete p;  //随意写的delete
        }
    
    private:
        CFactory* pFactory_;
    };
    
    
    int main()
    {
        CFactoryType_0 FactoryChild0;
        CFactoryType_1 FactoryChild1;
    
        CMakeCar MakeCar;
        MakeCar.SetFactory(&FactoryChild0);
        MakeCar.Deal(); //输出Type0
    
        MakeCar.SetFactory(&FactoryChild1);
        MakeCar.Deal(); //输出Type1
    
        return 0;
    }
    

    https://www.bilibili.com/video/av24176315/?p=8

    相关文章

      网友评论

          本文标题:工厂方法

          本文链接:https://www.haomeiwen.com/subject/gnnumqtx.html