单例模式(Singleton)
1、概念理解
是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类只有一个实例,即一个类只有一个对象实例。主要有两种模式:饿汉模式(立即加载方式),饱汉模式(延迟加载方式)。
2、基本结构
1. 要有一个私有的静态属性;
静态属性的好处:1.优先在内存中开辟空间,2.静态的属性被所有类对象共享。
2. 一定要有一个私有的构造方法,避免使用new进行创建实例,注意:如果使用new对象,必然就会产生新的实例;
3. 如果想调用本类的方法,必须要有静态方法,可以通过 类名称.方法 来进行调用;
4. 在静态方法中,可以调用静态属性,并把静态属性return给调用者。
注意:
1.避免报错,在方法中对属性对象进行判断是否为null,如果为null则创建实例,不为null,则直接返回属性对象。
2.单例模式创建的对象的内存地址都是一致的。
3、主要作用
1. 实例控制,单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例;
2. 灵活性,因为类控制了实例化过程,所以类可以灵活更改实例化过程。
4、应用场合
1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;
2. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
单例模式示例代码:
package singleton;
/**
* 单例模式:饿汉模式(立即加载方式),饱汉模式(延迟加载方式)
* 单例(态)模式(singleton):保证一个类只能有一个实例,这种设计模式就叫做单例模式。(不是java自带的,是前人总结的经验)
* 1.一定要有一个私有的构造方法,避免使用new进行创建实例,注意:如果使用new对象,必然就会产生新的实例。
* 2.如果想调用本类的方法,必须要有静态方法,可以通过 类名称.方法 来进行调用。
* 3.还要有一个私有的静态属性:
* 静态属性的好处:1.优先在内存中开辟空间,2.静态的属性被所有类对象共享。
* 4.在静态方法中,可以调用静态属性,并把静态属性return给调用者。
* 注意:避免报错,在方法中对属性对象进行判断是否为null,如果为null则创建实例,不为null,则直接返回属性对象。
* 注意:单例模式创建的对象的内存地址都是一致的。
*/
public class Singleton {
public static void main(String[] args) {
//饿汉模式(立即加载方式)
Singleton1 singleton11 = Singleton1.getInstance();
System.out.println(singleton11);
Singleton1 singleton12 = Singleton1.getInstance();
System.out.println(singleton12);
//饱汉模式(延迟加载方式)
Singleton2 singleton21 = Singleton2.getInstance();
System.out.println(singleton21);
Singleton2 singleton22 = Singleton2.getInstance();
System.out.println(singleton22);
}
}
//饿汉模式(立即加载方式)
class Singleton1{
//私有的静态属性
private static Singleton1 singleton = new Singleton1();
//私有构造方法
private Singleton1() {}
// 静态工厂方法
public static Singleton1 getInstance() {
return singleton;
}
}
//饱汉模式(延迟加载方式)
class Singleton2{
//私有的静态属性
private static Singleton2 singleton = null;
// 私有构造方法
private Singleton2(){}
//使用synchronized同步锁
public synchronized static Singleton2 getInstance(){
// 注意:里面的判断是一定要加的,否则出现线程安全问题
if(singleton == null){
singleton = new Singleton2();
}
return singleton;
}
}