维特根斯坦说世界可以分解为事实,而事实又分解为原子事实,原子事实(由对象组成)不可再分.那这里很明显的就是我们无法有一个标准来确定啥是原子事实.有些人觉得一个原子事实实际上可以再分,另一些人可能觉得不可分。架构不断
SRP(Single Responsibilities Principle)的定义:就一个类而言,应该仅有一个引起它变化的原因。简而言之,就是功能要单一。
What:单一职责
什么是单一职责原则:单一职责就是一个类只负责一项职责。当一个类有多个职责时就可能需要重构这个类了。
Why
该原则提出了对对象职责的一种理想期望。对象不应该承担太多职责,正如人不应该一心分为二用。唯有专注,才能保证对象的高内聚;唯有单一,才能保证对象的细粒度。对象的高内聚与细粒度有利于对象的重用和以后的扩展。
How
类T负责两个不事的职责:职责P1、职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原来运行的职责P2功能发生故障。解决方法:分别建立两个类完成对应的功能。
在实际工作中,单一职责是有利于类的拓展,也为项目架构的演进过程中提供了良好的支持,也提升了代码效率和风险控制,在实际项目中比较常见的现象就是,两个模块之间都有相同功能Aclass,但是这两个功能是不同开发人员来开发的,在小公司技术不成熟的负责人精力有限的情况下,这个功能就会重复开发两遍,其实这最重要的,重要的是在将来模块都更换了模块负责人以后功能的调整,会出现两个模块的不一致,也容易bug的只修复一个地方,另外一个地方的遗漏。
代码
懒汉
public class SPUtils {
private static SPUtils spUtils = null;
private SPUtils() {
}
public static SPUtils getInstant() {
if (spUtils == null) {
spUtils = new SPUtils();
}
return spUtils;
}
}
- 懒汉上扩展出较多变种,说明我们在日常工作中性能还是很重要的,尤其是移动端开发
在开发中一切简单的东西在加入多线程并发后问题就会变得复杂,直接加锁,这种也是使用很少的
public class SPUtils {
private static SPUtils spUtils = null;
private SPUtils() {
}
public static synchronized SPUtils getInstant() {
if (spUtils == null) {
spUtils = new SPUtils();
}
return spUtils;
}
}
再来一种,锁加在判断为空之后,好处就是不用每次都判断
public class SPUtils {
private static SPUtils spUtils = null;
private SPUtils() {
}
public static SPUtils getInstant() {
if (spUtils == null) {
synchronized (SPUtils.class) {
if (spUtils == null) {
spUtils = new SPUtils();
}
}
}
return spUtils;
}
}
饿汉
public class SPUtils {
private static SPUtils spUtils = new SPUtils();
private SPUtils() {
}
public static SPUtils getInstant() {
return spUtils;
}
}
最后来比较流行的写法
public class SPUtils {
private static SPUtils spUtils = null;
private SPUtils() {
}
public static SPUtils getInstant() {
return LayzSPutils.spUtils;
}
private static class LayzSPutils {
private static final SPUtils spUtils = new SPUtils();
}
}
这里就要讲到static的相关知识了,static的初始化优先级较普通类高,比如同样的代码块加载的时机比普通代码块早,字段同样如此,static还有一个特点就是在第一次初始化的生活会加锁,以后的使用就是一个普通的引用了。