java 单例模式的设计

版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/83280695

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.饿汉式和懒汉式的区别和特点

饿汉式:

  1. 开始就给创建好了实例,调用公共方法的时候,直接返回。开始就给创建好了实例,调用公共方法的时候,直接返回。
  2. 记忆方法,饿汉式一开始就很饿,所以一进来就直接创建实例。

懒汉式:

  1. 一开始声明为null,等要调用的时候再去new一个实例,然后再返回。
  2. 记忆方法,懒汉式很懒,没有到要调用时候不会去进行new。
  3. 优点:如果没调用,内存中不会存在Singleton实例的。
  4. 缺点:可能存在线程安全问题,线程挂起和激活问题。

7.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);
    }
	...
}

猜你喜欢

转载自blog.csdn.net/qq_34626097/article/details/83280695