设计模式之【单例模式】

设计原则是指导我们代码设计的一些经验总结,也就是“心法”;面向对象就是我们的“武器”;设计模式就是“招式”。

以心法为基础,以武器运用招式应对复杂的编程问题。

表妹:哥啊,为什么电脑上只能打开一个任务管理器呢?

我:首先,如果可以打开多个窗口,但这些窗口显示的内容是完全一致的,这是一种资源浪费;其次,如果这些窗口显示的内容不一致的话,就意味着某一瞬间系统有多个状态,这与实际不符,也会给用户带来误解。

表妹:原来是这样子~

我:这就用到了设计模式中的单例模式。


确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

为什么要使用单例模式?

避免资源访问冲突

比如,往文件中打印日志的Logger类:

public class Logger {
   
    private FileWriter writer;
    
    public Logger() {
   
        File file = new file("D:/Log/log.txt");
        writer = new FileWriter(file, true);  // true表示追加写入
    }
    
    public void log(String message) {
   
        writer.write(message);
    }
}

// Logger类的应用示例:
public class UserController {
   
    private Logger logger = new Logger();
    
    public void login(String name, String password) {
   
        // 省略业务逻辑代码
        logger.log(name + " logined!");
    }
}

public class OrderController {
   
    private Logger logger = new Logger();
    
    public void create(OrderVo order) {
   
        // 省略业务逻辑代码
        logger.log("Created an order: " + order.toString());
    }
}

从上面的代码中,我们可以看到,所有的日志都是写到同一个文件D:/Log/log.txt中的。很明显,在并发写入的时候,就会出现日志信息相互覆盖的情况。如下图所示:

在这里插入图片描述

可能有同学会说,可以加锁来解决并发问题。

是的,确实可以。但是,其实日志文件只有一份,没必要创建那么多Logger对象,毕竟系统的文件句柄是有限的资源。

所以,我们将Logger设计成一个单例类,程序中只允许创建一个Logger对象,所有的线程共享使用的Logger对象,共享一个FileWriter对象,而且FileWriter本身是对象级别线程安全的,也就避免了多线程情况下写日志会互相覆盖的问题。

public class Logger {
   
    private FileWriter writer;
    private static final Logger instance = new Logger();
    
    private Logger() {
   
        File file = new File("");
        writer = new FileW
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值