设计模式————工厂方法模式

本文深入探讨了工厂方法模式,对比简单工厂模式,介绍了其核心思想和实现方式。通过示例代码展示了如何通过工厂子类来控制产品的创建过程,使得客户端无需关心具体的产品实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  • 上一篇我分享了我对面对对象编程的理解,还分享了一个最简单的设计模式-简单工厂模式,这一篇我们来看一个类似的设计模式,工厂方法模式。我的理解是原本在简单工厂模式下,产品的产生逻辑和方法是被工厂类封装好的,只需要客户去调用函数产生产品,而在工厂方法模式下,产品的产生方法是被封装好了的(封装在子工厂类中),但产品的产生逻辑是有客户去控制的,这是他们之间最主要的区别。

其主要实现思路比较简单,如下:一个产品的父类,以及其具体产品的子类。
工厂类父类,以及具体到每个产品的工厂子类(工厂父类规定了创造那类产品,子类规定了这类产品的那个型号),工厂子类包含了创建产品的具体细节。
客户在使用时就创建一个父类的指针指向的时具体产品工厂,然后再产品指针=其父类指针调用的具体create函数。(这样就避免了客户并不知道产品子类的名称,且不需要要客户知道产品实例化的过程)

下面是我写的测试代码,欢迎交流:

//mianClass.h
#ifndef MIAN_CLASS
#define MAIN_CLASS
#include<iostream>
#pragma once

using namespace std;

class mainClass
{
public:
    mainClass();
    ~mainClass();

    virtual bool dosome(char *string ) = 0;
    //纯虚函数,需要子类实现具体的功能
private:

};


#endif
//mainClass.cpp
#include"mainClass.h"

mainClass::mainClass()
{

}

mainClass::~mainClass()
{

}
//subClass.h
#ifndef  SUB_CLASS
#define SUB_CLASS

#include"mainClass.h"

class subClass:public mainClass
{
public:
    subClass();
    ~subClass();

    bool dosome(char * string);
private:

};


#endif
//subClass.cpp
#include"subClass.h"

subClass::subClass()
{
}

subClass::~subClass()
{
}


bool subClass::dosome(char* string)
{
    printf("%s,当前子类实现", string);
    return  true;
}
//subClass1.h
#ifndef SUB_CLASS1
#define SUB_CLASS1

#include"mainClass.h"

class subClass1:public  mainClass
{
public:
    subClass1();
    ~subClass1();

    bool dosome(char * string);

private:

};



#endif

//subClass1.cpp
#include"subClass1.h"

subClass1::subClass1()
{
}

subClass1::~subClass1()
{
}

bool     subClass1::dosome(char *string)
{
    printf("%s,这是子类1实现", string);
    return true;
}
//subClass2.h
#ifndef SUB_CALSS2
#define SUB_CLASS2

#include"mainClass.h"

class subClass2 :public mainClass 
{
public:
    subClass2();
    ~subClass2();
    bool dosome(char* string);

private:

};


#endif // !SUB_CALSS2


//subClass2.cpp
#include"subClass2.h"


subClass2::subClass2()
{
}

subClass2::~subClass2()
{
}

bool subClass2::dosome(char * string)
{
    printf("%s,这是子类2实现", string);
    return true;
}
//FFcMod.h
#ifndef  FFC_MO D
#define FFC_MOD

#include<iostream>
#include"mainClass.h"
#pragma once

using    namespace std;

class FFcMod
{
public:
    FFcMod();
    ~FFcMod();

    virtual bool getchclass(mainClass* &pmianclass)=0;
private:

};



#endif 
//FFcMod.cpp
#include"FFcMod.h"

FFcMod::FFcMod()
{

}

FFcMod::~FFcMod()
{

}

//chFcMod.h
#ifndef CH_FC_MOD
#define CH_FV_MOD

#include"FFCMod.h"


class chFcMod:public FFcMod
{
public:
    chFcMod();
    ~chFcMod();
    bool getchclass(mainClass* &pmainclass);
private:

};



#endif
//chFcMod.cpp
#include"chFcMod.h"
#include"subClass.h"

chFcMod::chFcMod()
{
}

chFcMod::~chFcMod()
{
}

bool chFcMod::getchclass(mainClass* &pmainclass){

    pmainclass = new subClass();
    return true;
}


//chFcMod1.h
#ifndef CH_FC_MOD1
#define CH_FC_MOD1

#include"FFcMod.h"


class chFcMod1:public FFcMod
{
public:
    chFcMod1();
    ~chFcMod1();

    bool getchclass(mainClass* &pmainclass);


private:

};


#endif
//chFcMod1.cpp
#include"chFcMod1.h"
#include"subClass1.h"

chFcMod1::chFcMod1()
{
}

chFcMod1::~chFcMod1()
{
}


bool chFcMod1::getchclass(mainClass* &pmainclass)
{
    pmainclass = new subClass1();
    return true;
}
//chFcMod2.h
#ifndef CH_FC_MOD2
#define CH_FC_MOD2

#include"FFcMod.h"


class chFcMod2:public FFcMod
{
public:
    chFcMod2();
    ~chFcMod2();

    bool getchclass(mainClass* &pmainclass);


private:

};



#endif
//chFcMod2.cpp
#include"chFcMod2.h"
#include"subClass2.h"
chFcMod2::chFcMod2()
{
}

chFcMod2::~chFcMod2()
{
}

bool chFcMod2::getchclass(mainClass* &pmainclass)
{
    pmainclass = new subClass2();
    return   true;
}
//demo.cpp
#include"FFcMod.h"
#include"chFcMod.h"
#include"chFcMod1.h"
#include"chFcMod2.h"
#include<iostream>

int main(int argv, char args[])
{
    mainClass *pmain=nullptr;
    FFcMod *pffcmod = nullptr;

    pffcmod = new  chFcMod();
    pffcmod->getchclass(pmain);
    pmain->dosome("hello world!!!");

    pffcmod = new chFcMod1();
    pffcmod->getchclass(pmain);
    pmain->dosome("hello world!!!");

    pffcmod = new chFcMod2();
    pffcmod->getchclass(pmain);
    pmain->dosome("hello world!!!");

    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值