设计模式之Abstract Factory

前言:

  最近在研究android的时候,发现该系统大量使用了设计模式的知识。说来惭愧,在此之前,我从来没见过C++代码中有如此多重继承的

使用方法,并曾一度认为是android故意搞这么复杂,想让我们看不明白。后来在用JAVA开发android的程序时候,发现JAVA的API大部分也是这么弄的,不过用了Implements罢了....反思之,一定是我弄错了。这时候想起了设计模式,买来一看,真的是非常经典啊,所以准备写点东西,权当是笔记好了。

(该书已经看过一遍了,这是第二遍,准备每个模式都仔细体会下,难免有天马行空的地方--毕竟这是我给自己做的总结)

 

abstract factory

 学名抽象工厂。(设计模式是真正的面向对象,啥东西最终都会落实到对象上)。

简单场景,以前经常在linux和windows平台上开发网络程序,后来搞了一个类,叫NetServer,要支持跨平台。一般会咋做呢?NetServer会定于成一个纯虚类,里边全是一些虚函数(把它当做java的接口类好了,java确实更靠近OO)。比如说CreateListener,Connect等。然后在windows平台上写了一个实现类叫WinNetServer,在Linux平台上写了一个LinuxNetServer。那么在何种情况下使用呢?在NetServer.h中,提供了一个ConstructNetServer函数(不是类的成员),然后分别在WinNetServer.CPP和LinuxNetServer.CPP中实现这个函数(也可以在别的一个地方实现)。利用#ifdef WIN32等来new WinNetServer或者new LinuxNetServer。

这就是一个极其简单的抽象工厂类。

但是,从书上感觉,该类对应的情况可以更广泛。

1 在NetServer内部可以创建一系列的东西,比如CreateTCPSocket,CreateUDPSocket。这是该工厂生产的两类产品。通过工厂类,我能保证在一个程序中,所有相关的东西全是一个工厂里边生产出来的(例如都是win平台,或者linux平台下的)

2 使用者根本不需要知道到底下面真实用的是哪个具体类(这似乎是所有设计模式要做到的事情)

 

优缺点:

这里通过看书和仔细分析,解释下几个特点(书上有时候只有短短一句话,但却意义深刻)

1 工厂类有个极大的问题。例如,如果以后增加了CreateHTTP的函数,那么在所有类(基类和子类)都需要添加这个函数,即使这个函数生产出来的东西只是有个很小的变化----看来,如果基类开始不确定定义好的话,后续会有较大的改动。而且更深层次的意思是,如果要创建哪怕只有tcpsocket和其他不同的东西,都需要重新定义一个子类(意思是2个子类中,只有tcpsocket创建不一样,其他都一样,就这么简单的不同,都会需要重新定义一个子类)。--这个问题的解决办法可以通过prototype模式

2 一个工厂,每个产品都需要定义一个创建函数

  如 NetServerFactory(抽象工厂)--->创建NetServer(具体工厂)---->创建CreateTCPSocket(具体产品)。多个产品有多个这样的create函数(又被称为工厂函数),太麻烦了,不如Create(enum socketType)来解决....

 

3 按照上面的例子,NetServer是虚工厂,那实际工厂什么时候创建?这个应该是要么写死,要么条件编译,要么根据配置来产生。刚才那个ConstructNetServer实际是用来创建虚工厂的。

4 其实也可以这么做,在别的函数参数中,传递这个虚工厂接口(已经被实例化了的),然后调用虚工厂的方法来Create这个,Create那个。(这句是废话...呵呵)。

5 再想想还有什么特点呢?在UI方面似乎更容易些。有一个适用场景很重要,即工厂的产品应该有共同的基类。

(越来越深奥了,是的,工厂的create函数返回的结果应该是一个接口,然后在不同的平台下,该接口有不同实现---和bridge模式由啥区别?以后再说。这个特点很关键。)--bridge模式解决的是没有共同基类的情况。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值