4-工厂模式、通信套接字

橙三吉。 提交于 2020-03-04 07:47:17

1. 工厂模式

  1. 什么是简单工厂模式?
    答:使用一个单独的类来做创建势力的过程,就是工厂。比如:
    (1)有两个类:class RequestCodec : public Codecclass RespondCodec : public Codec,两个类都继承抽象类class Codec
    (2)若要创建两个类的对象时,需要直接调用该类的构造函数;
    (3)但若使用工厂模式,可以直接创建工厂类的对象,通过调用工厂类中已经实现好的成员函数,根据传参不同来创建两个类的对象;
    (4)通过工厂模式创建的两个类的对象是Codec类型对象,但由于多态,因此可以直接当作子类对象来使用。
  2. 简单工厂模式实现与使用?
//1. 两个类继承抽象类Codec
class RequestCodec : public Codec
class RespondCodec : public Codec

//2.创建工厂类
class BaseFactory
{
public:
	BaseFactory(){}
	~BaseFactory(){}

	//2.1通过成员函数创建两个类的对象
	Codec *createCodec(int flag)
	{
		Codec *c = NULL;
		//根据传参不同,分别创建不同的类对象
		if(flag == 1)	//RequestCodec类
		{
			c = new RequestCodec();
		}
		else if(flag == 2)	//RequestCodec类
		{
			c = new RespondCodec();
		}
		//返回Codec类型的对象
		return c;
	}
};
工厂类的使用
BaseFactory *fac = new BaseFactory();	//创建工厂类对象
Codec *codec = fac.createCodec(1);	//生成父类对象指针
codec->encodemsg();		//通过多态,父类指针指向子类对象
  1. 什么是工厂模式?
    答:(1)简单工厂模式只有一个工厂类,使用时只要传入不同的参数,就可以创建不同类的对象。但若要增加新的类到工厂类时,就需要修改工厂类的代码,扩展性差。
    (2)而工厂模式可以创建多个工厂类,所有工厂类都继承一个抽象类工厂基类,且每个工厂类只用来生成一种类的对象,使用时创建基类的工厂类对象指针,通过多态就可以调用不同派生工厂类中成员函数,以此来创建不同的类对象。若要创建新的类的对象时,只需要增加工厂类的派生类即可,而不许修改工厂类的代码。
  2. 工厂模式的实现及使用?
//1.两个类都继承抽象类Codec
class RequestCodec : public Codec
class RespondCodec : public Codec
//2.创建工厂类基类
class BaseFactory
{
public:
	BaseFactory(){}
	//工厂派生类必须要创建Codec不同派生类的对象
	virtual Codec *createCodec();
	~BaseFactory(){}
};

//3.创建工厂派生类,每个类之创建一种类对象
class RequestFactory
{
	RequestFactory(){}
	//创建RequestCodec对象函数
	Codec *createRequest()
	{
		RequestCodec *req = new RequestCodec()
		return req;
	}
	~RequestFactory(){}
};
class RespondFactory
{
	RespondFactory(){}
	//创建RespondCodec对象函数
	Codec *createRequest()
	{
		RespondCodec *req = new RespondCodec()
		return req;
	}
	~RespondFactory(){}
};
工厂类的使用
//创建工厂基类对象指针指向工厂派生类对象
BaseFactory *BF = new RequestFactory();	
//通过多态,基类对象指针调用派生类成员函数来创建指定类基类的对象指针
Codec *codec = BF->creatRequest();
//通过多态,基类对象指针调用派生类成员函数
codec->encodeMsg();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!