java中单例设计模式
单例设计模式的目的:希望在程序运行过程中只创建一个对象。
单例设计模式有两种表达方式:
- 饿汉模式
- 懒汉模式
两者之间的区别:
- 二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建。
- 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。
- 饿汉式存在浪费资源的可能。因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题。
- 在我们javaSE标准类中,java.lang.Runtime就是经典的单例模式。
饿汉模式的实现
解释:饿汉模式,创建对象的方法上使用了 static关键字,在类加载的时候就行了创建,如下代码所示,不管调用多少次getInstance()方法,在同一个程序中,类只加载了一次,所以构造器只调用了一次,非常的专一,在多线程中,不会受到其他线程的影响,因为对象只创建了一次,而且是在类加载的时候。
创建步骤:
- 将构造器私有化
- 在类的内部直接创建对象(该对象是static修饰)
- 提供一个公共的static方法,返回gf对象
package JavaTest;
public class 饿汉模式 {
public static void main(String[] args) {
GirlFriend gf1 = GirlFriend.getInstance();
GirlFriend gf2 = GirlFriend.getInstance();
System.out.println(gf1);
System.out.println(gf2);
}
}
class GirlFriend {
private String name ;
public static final int n1= 100;
private static GirlFriend gf = new GirlFriend("小红");
public GirlFriend() {
}
public GirlFriend(String name) {
System.out.println("构造器被调用了~");
this.name = name;
}
public void showGirlfriend() {
}
public static GirlFriend getInstance() {
return gf;
}
public static void setInstance(GirlFriend gf) {
GirlFriend.gf = gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
饿汉模式测试结果
懒汉模式的实现
目的:只有在用户调用的时候才会进行创建,通过if判断,对象是否存在,来进行创建对象,保证了对象之被创建一次。
实现步骤
- 将构造器私有化
- 定义一个static静态属性对象
- 提供一个public static方法,可以返回一个对象
- 只有当用户调用getInstance方法时,才能返回对象,后面再次调用,会返回上次创建的对象,保证了单例
package JavaTest;
public class 懒汉模式模拟 {
public static void main(String[] args) {
Dog dog2 = Dog.getInstance();
Dog dog1 = Dog.getInstance();
System.out.println(dog1.getName());
System.out.println(dog2.getName());
}
}
class Dog {
private String name;
private static Dog dog ;
public Dog(String name) {
System.out.println("构造器被调用了");
this.name = name;
}
public static Dog getInstance() {
if(dog==null) {
dog = new Dog("旺财");
}
return dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}