单例设计模式
单例模式介绍
-
1. 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中
-
(1)对某个类只能存在一个对象实例
-
(2)并且该类只提供一个取得对象实例的方法
-
2. 分类(两种方式)
-
(1)饿汉式
-
(2)懒汉式
单例模式的实现方法
-
(1)类的内部创建对象
-
(2)构造器私有化—>防止直接new
-
(3)向外暴露一个静态的公共方法:用于返回对象(getinstance)
单例模式的经典案例
javaSE 标准类中,java.lang.Runtime就是经典的单例模式。
一、饿汉式
解释:只要类加载,无论是否使用该类的实例对象,都会在类中创建对象实例
形象理解:很饿,饥渴难耐,无论是否使用该对象,都会创建
代码示例
package pattern.sigal;
public class main {
public static void main(String[] args) {
girlfriend instance = girlfriend.getinstance();
System.out.println(instance);
}
}
class girlfriend{
private String name;
private static girlfriend gf = new girlfriend("女朋友");
private girlfriend(String name) {
System.out.println("构造器被调用");
this.name = name;
}
public static girlfriend getinstance(){
return gf;
}
@Override
public String toString() {
return "girlfriend{" +
"name='" + name + '\'' +
'}';
}
}
构造器被调用
girlfriend{name='女朋友'}
二、懒汉式
解释:只有在对象被使用时才会创建
形象理解:很懒,有需求了才做
代码示例
package pattern.lazy;
public class main {
public static void main(String[] args) {
Cat cat = Cat.getInstance();
System.out.println(cat);
Cat cat1 = Cat.getInstance();
System.out.println(cat1);
System.out.println(cat == cat1);
}
}
class Cat {
private String name;
private static Cat cat;
private Cat(String name) {
System.out.println("构造器被调用");
this.name = name;
}
public static Cat getInstance() {
if (cat == null) {
cat = new Cat("小猫");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
构造器被调用
Cat{name='小猫'}
Cat{name='小猫'}
true
饿汉式和懒汉式对比
-
1. 最主要的区别:创建对象的时机不同
-
(1)饿汉式:在类加载就创建了对象实例
-
(2)懒汉式:在使用时才创建。
-
2. 关于线程安全问题
-
(1)饿汉式:不存在
-
(2)懒汉式:存在
-
补充说明:后面学习线程后,再完善
-
3. 关于资源浪费问题
-
(1)饿汉式:存在浪费资源的可能
-
解释:只要类加载,就会执行创建对象实例,如果对象实例没有被使用,就造成了资源的浪费
-
(2)懒汉式:不存在资源浪费问题
-
解释:懒汉式模式下,对象在使用时才创建,就不存在这个问题。