单例设计模式
设计模式:大量实践中总结和理论化之后优选的代码结构
单例模式:采取一定方法,保证在整个软件系统中,对某个类只能存在一个对象实例(不能再有第二个),并且该实例只能提供一个获得其对象实例的方法。
两种模式
饿汉式单例模式的实现:
-
1、构造器私有化 -> 防止直接new
-
2、类的内部创建 静态 对象
-
3、向外暴露一个 静态 的公共方法 getInstance
public class singleTest {
public static void main(String[] args) {
Single01.getInstance().sayHi();
Single01 single01 = Single01.getInstance();
single01.sayHi();
Single01 single011 = Single01.getInstance();
System.out.println(single01==single011);
}
}
class single01 {
private single01(){};
private static single01 instance = new single01();
public static single01 getInstance(){
return instance;
}
public void sayHi(){
System.out.println("Hi~");
}
}
注意一定要用static对instance与getInstance进行修饰,这样在使用时才能不new一个对象就能使用此方法与此成员。
为什么叫做 “饿汉式” 还没有使用实例的时候就创建好了(着急) 比较占用内存空间
懒汉式单例模式的实现:
饿汉式可能造成创建了对象但是没有使用,造成较大的内存浪费。为了弥补这一弊端,使用懒汉式(使用了才会出现)
实现步骤
-
1、构造器私有化
-
2、定义一个私有静态对象,但是不new
-
3、暴漏一个静态公共方法getInstance(),判断私有静态对象是否被创建,被创建就原封不动的返回,未创建就创建一个(由于构造器私有化,只能在getInstance()中创建对象,不会在外部创建)。
实现示例:
package com.single_design.lazy;
public class single02{
public static void main(String[] args) {
Cat cat1 = Cat.getInstance();
System.out.println(cat1.n);
Cat cat2 = Cat.getInstance();
System.out.println(cat1 == cat2);
}
}
class Cat {
private String name;
private Cat(String name) {
System.out.println("构造器被使用");
this.name = name;
}
public static int n = 999;
private static Cat cat;
public static Cat getInstance(){
if(cat == null){
cat = new Cat("mxy");
}
return cat;
}
}
饿汉式与懒汉式对比:
-
主要区别是对象创建的时机不同,饿汉式是在类加载的时候就创建对象,而懒汉式是在使用时才创建对象
-
饿汉式不存在线程安全问题,懒汉式存在线程安全问题(同时有多个线程进入getInstance方法时,在一瞬间会创建多个对象,没有真正实现单例模式)
-
饿汉式存在资源浪费的可能性,若一个对象没使用就会浪费资源
-
java.lang.Runtime就是经典的单例模式
