最近在写代码时想了这样一个问题,和室友讨论了一番,做了如下总结。
简单来说:service是有状态的,工具类是无状态的,单例可以有状态也可以无状态。
工具类提供静态方法,只要输入一定,输出就是一定的,它不依赖于其它外部的数据,也不保存数据
例如,字符串的操作,日期格式的转换,json串的转换
Service,虽然它的逻辑是一定的,但是它依赖于外部的数据,可能是其它系统中的(rpc调度),其它数据存储中的(访问mysql,redis),以及本地其它模块的(比如调用其他的service)
误区:业务代码就必须得放在service里,这种想法是错误的,有些无状态的业务逻辑是可以封装成工具类的
单例,它既可以是有状态,也可以是无状态的。单例首要考虑的是该类的对象在系统中存在一个最合适,但是这种往往都是有状态的,比如数据库连接,qconfig对象,本地文件持有对象,这种只应该有一个对象来持有,而且对象依赖于外部的配置或者数据,这种使用单例再合适不过了。
而如果无状态的也用单例,也无可厚非。例如,对于加解密,如果传入的是明文密文+密钥,那么这种就可以设计成工具类,当然设计成单例也没有什么问题,但是工具类会更好一些
如果只传明文密文,而依赖于外部的密钥,可以设计成单例。