单例设计模式(Singleton)
单例设计模式:采取一定的方法保证在整个的软件系统中,某个类只能在一个对象实例
一、实现方法
1.饿汉式
public class SingletonTest {
public static void main(String[] args) {
Bank bank=Bank.getInstance();
Bank bank2=Bank.getInstance();
System.out.println(bank==bank2);
}
}
//饿汉式
class Bank{
//1.私有化类的构造器
private Bank() {
}
// 2.内部创建类的对象
// 4.要求此对象也必须声明为静态的
private static Bank instance=new Bank();
// 3.提供公共的静态的方法,返回类的对象
public static Bank getInstance() {
return instance;
}
}
输出结果为:true
//此案列是饿汉式,因为instance在static构造器中有创建对象 ,,
private Order(){}
private static Order instance=null;
static{
instance=new Order();
}
private static Order getInstance(){
return instance;
//此案例也是单列的
public class SignletonTest3 {
public static void main(String[] args) {
A a=A.instance;
A a2=A.instance;
System.out.println(a==a2);
a2=null;//因为权限为public,所以赋值不会报错
System.out.println(a==a2);//此时结果为false
}
}
class A{
private A() {}
public static A instance=new A();//当权限为public时,类型要设置成static final保证其值不会被更改
}
2.懒汉式
public class SingletonTest2 {
public static void main(String[] args) {
Order order=Order.getInstance();
Order order2=Order.getInstance();
System.out.println(order==order2);
}
}
class Order{
//1.私有化类的构造器
Order() {}
//2.声明当前类的对象。没有初始化[此对象也必须是static的]
private static Order instance=null;
//3.声明public static 的返回当前类的对象
public static Order getInstance() {
if(instance==null) {//通过判断instance值来确定是否有创建对象
instance =new Order();}
return instance;
}
输出结果为:true
二、区分饿汉式和懒汉式
1.饿汉式:好处(是线程安全的),坏处(对象加载的时间过长)
2.懒汉式: 好处(延迟对象的创建),坏处(非线程安全)
单例设计模式应用场景
- 网站的计数器
- 应用程序的日志应用
- 数据库连接池
- 项目中,读取配置文件的类
- Application
- windows的任务管理器、回收站
三、总结
1.单例模式只会有一个对象,所以无论是懒汉式还是饿汉式,最终判断两个对象是否相等都一定会是true。
2. 适用场景:
1.需要生成唯一序列的环境
2.需要频繁实例化然后销毁的对象。
3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
4.方便资源相互通信的环境