单例模式、工厂模式

一、单例模式

单例模式是校招中最常考的设计模式之一。

啥是设计模式?
设计模式好比象棋中的"棋谱":红方当头炮,黑方马来跳… 针对红方的一些走法,黑方应招的时候有一些固定的套路,按照套路来走局势就不会吃亏。
软件开发中也有很多常见的"问题场景",针对这些问题场景,大佬们总结出了一些固定的套路,按照这个套路来实现代码,也不会吃亏。

单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例!

这一点在很多场景上都需要,比如 JDBC 中的 DataSource 实例就只需要一个。

注意: 像这样的需求,不依赖单例模式,就只是靠"君子协定"能不能行?也是可以的!但是人总是避免不了犯错,单例模式就是针对上述的需求场景进行了更强制的保证!当创建出多个实例时,就会编译报错~

单例模式具体的实现方式,分成"饿汉"和"懒汉"两种:

1.1 饿汉模式

1.1.1 实现

类加载的同时,创建实例:

class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}    

在这里插入图片描述
同时构造方法是private私有的,不能在类外创建!:
在这里插入图片描述
为什么被叫作"饿汉模式"呢?
在这里插入图片描述

1.1.2 补充

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

y属性是static修饰,静态的;x属性是普通的~:
在这里插入图片描述

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);  // true!!!

1.2 懒汉模式

1.2.1 单线程版

类加载的时候不创建实例,第一次使用的时候才创建实例:

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

1.2.2 多线程版

上述讲解的饿汉模式和懒汉模式,如果在多线程环境下调用getInstance,是否是线程安全的?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

怎么解决???
使用volatile!!!
volatile 有两个功能:1.解决内存可见性问题;2.禁止指令重排序

代码完全体:
在这里插入图片描述

二、工厂模式

举个例子,高中数学课,我们学过笛卡尔坐标系和极坐标系。我们发现,用代码来构造坐标时,两种方法的参数完全一致:
在这里插入图片描述
在Java标准库里,有线程池:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yyhgo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值