设计模式(单例,工厂,策略)

文章介绍了在不同调度场景下,如何利用单例模式管理摄像头对象,确保代码的可维护性和扩展性。通过CameraFactory,采用工厂模式根据项目需求创建和管理不同类型的camera。同时,策略模式用于简化业务逻辑中的条件分支,提高代码的灵活性。这样设计便于后续功能的添加和代码的优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用场景:

对于不同的调度,我们要采集不同摄像头的数据,不同的项目可能有不同的摄像头配置。所以为了后续代码的可维护和易扩展,每一个不同的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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值