什么是单例设计模式
1.单例设计模式是指采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并对该类只提供一个取得其对象实例的方法。
2.单例设计模式有两种方式:1)饿汉式;2)懒汉式。
饿汉式步骤如下:
1)构造器私有化(防止创建新对象)
2)类的内部创建对象
3)向外暴露一个静态的公共方法(getInstance)
4)代码实现
饿汉式(不使用对象实例,类也已经创建好对象实例了,可能造成资源浪费)
package com.pero.single;
/**
* 1)构造器私有化(防止创建新对象)
* 2)类的内部创建对象
* 3)向外暴露一个静态的公共方法(getInstance)
* 4)代码实现
*
* @version 1.0
* @author Pero
*/
public class SingleTon01 {
public static void main(String[] args) {
// GirlFriend lucy = new GirlFriend("lucy");
// GirlFriend jane = new GirlFriend("jane");
//通过方法可以获得对象
GirlFriend instance = GirlFriend.getInstance();
System.out.println(instance);
}
}
//一个类GirlFriend
//只能有一个女朋友
class GirlFriend{
private String name;
//为了能够在静态方法中返回对象,所以需要用static修饰来创建静态对象
private static GirlFriend girlFriend = new GirlFriend("lucy");
//如何保障只能创建一个对象
//单例模式-饿汉式(只要类一旦加载,对象就被创建,不管使不使用,对象依然被创建)
//步骤一:将构造器私有化
//步骤二:在类内部直接创建私有的静态对象
//步骤三:创建一个公共的静态方法返回对象
/*public*/private GirlFriend(String name) {
this.name = name;
}
//使用静态方法,是通过不创建对象直接通过类调用方式调用方法
public static GirlFriend getInstance(){
return girlFriend;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
懒汉式(使用时创建对象实例,不会造成资源浪费)
package com.pero.single;
/**
*单例模式懒汉式的测试
*
* @version 1.1
* @author Pero
*/
public class SingleTon02 {
public static void main(String[] args) {
System.out.println(Cat.age);
System.out.println(Cat.getInstance());
//再次调用Cat.getInstance()不会再次创建一个对象
}
}
//只能创建一个对象
//使用单例模式
class Cat{
private String name;
public static int age = 3;
private static Cat cat;
//步骤一:构造器私有化
//步骤二:定义一个静态属性对象
//步骤三:提供一个public的static方法getInstance(),可以返回一个cat对象
private Cat(String name) {
System.out.println("Cat(String name)构造器被调用");
this.name = name;
}
public static Cat getInstance(){
if (cat == null){//如果对象实例还没有创建,就创建一个对象实例
cat = new Cat("小花猫");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
饿汉式和懒汉式的区别
1)饿汉式是在类的加载时就创建了对象实例,懒汉式是在使用时才创建对象实例
2)饿汉式不存在线程安全问题,懒汉式存在线程安全问题(当多个线程同时执行getInstance()方法时,判断为对象引用为空,并创建多个对象)。
3)饿汉式存在资源浪费的可能,如果对象实例没有被使用,那么创建的对象所占用的资源被浪费,懒汉式是使用时才创建对象实例,不存在资源浪费问题。