java 单例模式的设计
1.什么是设计模式
设计模式是在大量的实践中总结的理论化之后优选的代码结构、编码风格,以及解决问题的思考方式。设计模式就像经典经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己在思考和摸索。
2.什么是单例模式
类的的单例设计模式,就是在采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象。
3.java设计单例模式的方法
首先必须先将类的构造方法的访问权限设置为private,这样就不能用new操作符在类的外部产生类的对象了,但在类的内部仍然可以产生对象。因为在类的外部开始还无法取得类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义为成静态的。
4.饿汉式demo,内附java单例模式的实现步骤
单例的设计模式:
*1.解决的问题,使一个类只能够创建一个对象
*2.如何实现?
*/
//饿汉式
public class Test {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);//true
}
}
//只能创建Singletong的单个实例
class Singleton{
//1.私有化构造器,使得在类的外部不能够调用构造器
private Singleton(){
}
//2.自己在类的内部创建一个类的实例
private static Singleton instance = new Singleton();
//3.私有是此对象,通过公共的方法来调用,体现封装性
//4.此公共的方法,只能通过类来调用,因为设置为static的,同时类的实例也必须是static
public static Singleton getInstance() {
return instance;
}
}
5.懒汉式demo,内附java单例模式的实现步骤
//懒汉式
public class Test2 {
public static void main(String[] args) {
Singleton1 s1 = Singleton1.getInstance();
Singleton1 s2 = Singleton1.getInstance();
System.out.println(s1 == s2);//true
}
}
class Singleton1{
//1.私有化构造器,使得在类的外部不能够调用构造器
private Singleton1() {
}
//2.自己在类的内部创建一个类的实例,使其等于null
private static Singleton1 instance = null;
//3.声明公共的获取方法,只能通过类来调用,因为设置为static同时实例也必须为static声明的
public static Singleton1 getInstance() {
//4.懒汉式特点,判断是否已经实例化过了,有则直接返回,无则new一个。
if(instance == null) {
instance = new Singleton1();
}
return instance;
}
}
6.饿汉式和懒汉式的区别和特点
饿汉式:
- 开始就给创建好了实例,调用公共方法的时候,直接返回。开始就给创建好了实例,调用公共方法的时候,直接返回。
- 记忆方法,饿汉式一开始就很饿,所以一进来就直接创建实例。
懒汉式:
- 一开始声明为null,等要调用的时候再去new一个实例,然后再返回。
- 记忆方法,懒汉式很懒,没有到要调用时候不会去进行new。
- 优点:如果没调用,内存中不会存在Singleton实例的。
- 缺点:可能存在线程安全问题,线程挂起和激活问题。
- 点击进入 互斥锁之单例模式的懒汉式的线程问题
7.若枚举只有一个成员, 则可以作为一种单例模式的实现方式
8.jdk单例模式的典型应用
public class Runtime {
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
//---------------------------下面代码方法先不用看,上面其实就是单例模式饿汉式的应用-------------------
public void exit(int status) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkExit(status);
}
Shutdown.exit(status);
}
public void addShutdownHook(Thread hook) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new RuntimePermission("shutdownHooks"));
}
ApplicationShutdownHooks.add(hook);
}
...
}