java中23中设计模式有助于更加高效的进行开发工作。近期开始写博客又开始复习设计模式,今天先简单记录一下单例模式的应用。
单例模式的提出是为了在内存中只存在一个对象,所有有关这个类的引用都指向内存中的这个对象,所以衍生出了单例模式。
单例模式设计思想:
1、因为内存中只存在一个对象,所以应该限制这个对象的创建。
2、但是为了让其他程序能用这个对象,所以在本类中直接创建对象。
3、在本类中创建了对象之后,对外提供对这个对象的访问方式。
单例模式的具体实现代码:
package main.java;
public class Single {
private int age = 10;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//把构造器私有化,禁止其他类中创建对象
private Single(){}
//在本类中直接创建对象,只在本类使用,所以私有化,为了让静态方法访问此变量,所以定义为静态变量
private static Single s = new Single();
//对外提供的访问对象方法,想访问方法只能通过对象或者类,但是外部不能创建对象,只能通过类,所以把此方法定义为静态方法
public static Single getInstance(){
return s;
}
public static void main(String[] args) {
Single s1 = Single.getInstance();
System.out.println(s1.getAge());//age:10
s1.setAge(20);age:20
Single s2 = Single.getInstance();
System.out.println(s2.getAge());//age:20
//此时s1和s2引用的是同一个对象,所以s1属性变了意味着s2的属性也随之改变。
}
}
单例模式有两种方法,上述的称为“饿汉式”,还有下面这种称为“懒汉式”
package com.run.exercise;
public class SingleLazy {
private SingleLazy(){}
private static SingleLazy s = null;
public static SingleLazy getInstance(){
if(s == null){
s = new SingleLazy();
}
return s;
}
}
两者的区别就是前者类一加载就会创建对象,而后者是调用getInstance()方法之后才会创建对象,但是懒汉式的调用会存在线程安全的问题,具体解决可以参考以下博文:
https://blog.csdn.net/dmk877/article/details/50311791
如有不正确欢迎指正。