含义:
顾名思义,所谓单例模式就是一个类只能产生一个实例化对象;
设计思想:
第一、类要只产生一个实例化对象就意味着其外部类不能随意产生实例化对象,也就是说其外部不能调用该类的构造方法,即在该类的构造方法设的属性为private属性。如:
class Person{
private Person(){
}
}
第二、构造方法被私有化,该类处于封闭状态;此时要想继续调用该类的方法,必须要提供实例化对象,而外部类又无法实例化对象,所以必须在该类内部创建一个实例化对象;如:
class Person{
Person per = new Person();
private Person(){
}
}
第三、Person类内部的per属性是一个普通属性,普通属性必须在实例化对象后才能分配内存空间,现在外部类无法实例化对象,因此可以使用static关键字,用来修饰内部创建的对象。调用时只需类名.属性;如:
class Person{
static Person per = new Person();
private Person(){
}
}
第四、类中属性一般设为私有属性,所以要使用private修饰,使用private修饰属性,必须要提供getter()方法,而且外部无法实例化对象,所以getter()也要使用static修饰。如:
class Person{
private static Person per = new Person();
private Person(){
}
public static Person getPer(){
return per;
}
}
分类:
一般分为:懒汉式和饿汉式;
饿汉式不管是否使用Person类,只要加载该类,就会创建一个公共的per对象,而且运行中希望只能够有一个实例化对象,所以会在 per属性前加一个final关键字,确保对象不被修改;如:
class Person{
private final static Person per = new Person();
private Person(){
}
public static getPer(){
return per;
}
pubic void print(){
Ssytem.out.println("this is a person");
}
}
public class Student{
public static void main(String[] args){
Person person = null ; //声明对象
person = Person.getPer();//调用静态方法
person.print();
}
}
懒汉式是当第一次去使用Person对象时,才会为其产生一个实例化对象;但是懒汉式存在多线程安全问题,饿汉式不会;如:
lass Person{
private static Person per ;//声明
private Person(){
}
public static Person getPer(){
if(per == null )//表明还未实例化
per = new Person();
return per;
}
pubic void print(){
Ssytem.out.println("this is a person");
}
}
public class Student{
public static void main(String[] args){
Person person = null ; //声明对象
person = Person.getPer();//调用静态方法
person.print();
}
}