设计模式之工厂方法模式

前段时间封装了两个socket类,一个clsServer一个clsConnection,希望能以回调的形式处理网络数据,用户只管读、写数据而不用关心socket fd什么时候可读什么时候可写,大概这个样子: 

以上两个类都是基类,对于clsConnection一般来说用户会需要重载的OnRead函数,在读到数据后做相关的逻辑。而对于clsServer用户需要重载OnAccept函数,在此函数中对新生成的连接对象做相应处理,比如发一个欢迎信息,将新对象加到列表中等等。

现在的问题在于clsServer中怎么创建ConnectionObj然后调用OnAccept通知新的对象已经生成。在clsServer中DoAccept函数是生产新连接对象的函数:

因为DoAccept中的大部分逻辑(除了第5行)都是固定的,所以DoAccept不允许clsServer子类继承重写,但是又希望不同子类的DoAccept能生成不同的ConnectionObj(第5行需要new clsConnection的子类,而不是像上面那样new clsConnection)。处理方法可以这样:

注意第9行,不是直接new一个对象,而是调用CreateConnection,这样子类如果希望Server能产生自己的连接对象的话,可以重载Server的CreateConnection方法,返回自己的Connection就可以了,以下是示例:

上面的CreateConnection就是所谓的工厂方法,工厂方法模式就是提供一个接口,让子类决定该实例化哪个类,相当于把类的实例化延迟到子类。在上面的例子中,基类clsServer只知道它要在DoAccept中生成一个Connection对象,但是具体生成哪个类(clsConnection的子类)的对象它不知道,需要到clsServer的子类中才知道自己需要创建哪个类型的Connection对象,所以提供一个方法出来,专门用于实例化clsConnection,供子类重载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值