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

 

工厂方法模式

复制代码
/************************************************************************
设计模式
工厂方法模式

在简单工厂里,工厂类的职责是根据不同的输入去实例化不同的类对象(实例化不同
类对象的代码是在一个工厂类中),作为客户端来说,所要做的就是根据需要来为
简单工厂传递不同的参数,当有新的需求增加时,需要再增加一个功能类的同时,
需要去修改简单工厂总根据输入实例化不同类的代码,在之前说过,这违反了开闭原则,
就是多当要扩展了时必须要修改代码。  在工厂类中一般是在其构造函数中实例化不同
的功能类。

在工厂方式模式中,两次用到了多态机制。
工厂方法模式中,有一个工厂类的(抽象)基类,工厂基类的每个子类的作用是实例化
不同的功能类(对象), 一个功能类对应一个工厂子类,一一对应,每个工厂类需要
继承重写的(虚)方法用来创建不同的功能类对象。 这一点也不同于简单工厂模式中的
在其构造函数中实例化不同类对象。
客户端根据需要去实例化不同的工厂子类,其返回值赋给工厂(抽象)父类对象(多态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 << "我是白人,我的肤色是白色!\r\n";
}

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

//黑人类
class Black : public IHuman
{
public:
    Black();
    virtual ~Black();
    virtual void ShowSkin() const;
};

Black::Black(){}
Black::~Black(){}
void Black::ShowSkin() const
{
    cout << "我是黑人,我的肤色是黑色\r\n";
}

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

//黄人类
class Yellow : public IHuman
{
public:
    Yellow();
    virtual ~Yellow();
    virtual void ShowSkin() const;
};

Yellow::Yellow(){}
Yellow::~Yellow(){}
void Yellow::ShowSkin() const
{
    cout << "我是黄种人,我的肤色是黄色\r\n";
}

//////////////////////////////////////////////////////////////////////////
复制代码

 

 

下面是工厂类继承结构

复制代码
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;
}
复制代码

 

 

 

  

 

posted on   崔好好  阅读(210)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示