使用场景:
对于不同的调度,我们要采集不同摄像头的数据,不同的项目可能有不同的摄像头配置。所以为了后续代码的可维护和易扩展,每一个不同的camera设计为单例,将camera对象放到CameraFactory中,然后在真正调度的场景中使用策略匹配不同的Camera调度。从这我们也可以看出,单例和工厂都是偏对象创建的模式,策略是偏对象行为的。
代码实例:
1.单例
单列有好多中写法,最重要的是要保证线程安全
//volatile 是为了多CPU多线程情况下的内存可见性,防止对象被篡改
private static volatile DvrCamera DvrInstance = null;
public static DvrCamera getInstance(XXXService service) {
if(DvrInstance == null) {
synchronized (DvrCamera.class) {
//第一个Null好理解主要是判断对象是否被创建,第二个Null主要是对于多线程case的判断
if(DvrInstance == null) {
//因为一个对象的new过程在cpu看来会拆分成三步来完成:
//1.为对象分配内存空间 2.初始化对象 3.设置对象指向刚分配的内存地址
//如果不使用volatile关键字,指令重排后,有可能把3放在最前面,这个时候instatnce就不null了,
//此处的空判断也就失效了
DvrInstance = new DvrCamera(service);
}
}
}
return DvrInstance;
}
2.工厂模式
private Map<Integer, BasexxxAdapter> cameraMap = new HashMap<>();
CameraFactory(Service service) {
xxxService = service;
if(xxxService .FOR_TEST_FILTER_CAMERA) {
//单例模式获取到的对象放到Map中管理
cameraMap.put(xxxService.CAMERA_TYPE_DVR, DvrCamera.getInstance(service));
cameraMap.put(xxxService.CAMERA_TYPE_xxx, xxxCamera.getInstance(service));
}
}
//工厂中提供一个获取产品的方法
public BasexxxAdapter getCamera(int cameratype) {
if(!cameraMap.containsKey(cameratype)) {
throw new IllegalArgumentException("camera type not supported.");
}
return cameraMap.get(cameratype);
}
3.策略模式
策略模式最常用的场景就是替换代码中的if ... else ..,简化代码,同时也方便后续扩展功能。
//在业务逻辑中一句话搞定
mCameraFactory.getCamera(cameraType).xx_function__xx(parameter);