设计模式学习(3)

5.单例模式

单例(单件)模式确保一个类只有一个实例,并提供一个全局访问点。

public class Singleton{
    private static Singleton uinqueInstance;
    private Singleton(){}
    public static Singleton getInstance(){
        if(uniqueInstance ==null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

把构造器声明为私有,可以保证外部无法实例化对象,同时Singleton类提供一个静态getInstance()的方法,使外部可以获得单一的对象。不过这段代码同时还存在一个问题,如果有两个线程在同时执行getInstance()方法时(这时uniqueInstance还未初始化),可能会实例化两个Singleton对象。
下面是解决方案:
(1)
这里写图片描述
这种方案会影响程序执行效率。
(2)
这里写图片描述
这种方法在jvm加载类时就创建对象,如何对象一直未被使用,会造成资源浪费。
(3)
这里写图片描述
这种方案只有在第一次getInstance()时会引发同步,其余时间都会正常运行,可以极大限度减少getInstance()的时间消耗。

6.命令模式

定义:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销操作。
(1) eg:以遥控器为例进行说明。假如现在你有一个多功能遥控器,你想用这个遥控器对家里的一些电器进行控制,比如电视,空调,热水器,卧室灯,客厅灯等。现在有3个概念需要明确,调用者,接收者,命令。对这个例子来讲,遥控器就是调用者,它可以调用所有的命令(也可以设置命令,注意,这些命令是用对象封装起来的,所以可以通过参数来设置),接收者就是各种家用电器,而命令就是你的每个动作行为,就是你想要做的事情,如果你想要“打开电视”,那么“打开电视”就是一个命令,同理“关闭电视”也是一个命令。在每个命令中都会包含着execute()方法,和命令的接收者,由接收者真正完成命令。命令模式类图如下:
这里写图片描述
(2)利用命令模式可以实现撤销
实现思路是:在Command接口加上undo()操作,然后具体的命令也都要实现undo()操作。然后在调用者中加入undoCommand状态变量,记录最后一次执行的命令是什么,然后对最后一次执行undo()。具体实现可参照下图:
这里写图片描述
这里写图片描述
这里写图片描述

命令模式将请求发出者与请求接收者解耦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值