单例设计模式:一个类中只允许产生一个实例化对象。
第一,首先考虑如何让限制对象的数量。
平常在普通方法中则是类的外部通过对象调用,无法达到限制对象数量的目的。
package www.bit.java;
class Singleton {
public void print(){
System.out.println("Helloworld");
}
}
public class SingletonTest {
public static void main(String[] args) {
//实例化对象
Singleton singleton1 = new Singleton();
singleton1.print();
}
}
所以需要用private生命构造方法,则对象的产生是通过构造方法产生对象。
class Singleton {
//private声明构造,限制在外部产生对象的方法
private Singleton(){};
public void print(){
System.out.println("Helloworld");
}
}
第二,构造方法私有后,外部不能调用构造。
当外部无法调用构造方法,即外部不能够产生新的实例化对象,此时类则处于一个相对而言封闭的状态,如果继续想要使用Singleton该类调用print方法,则必须提供实例化对象。
考虑到封装的特点,可以在类的内部产生一个实例化对象。
class Singleton{
//在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
Singleton singleton = new Singleton();
//private声明构造,限制在外部产生对象的方法
private Singleton(){};
public void print(){
System.out.println("Helloworld");
}
}
第三,Singleton无法实例化对象时,对singleton进行使用。
Singleton内部的singleton是一个普通属性,所有的普通属性必须在有实例化对象时才能进行内部空间的分配,则使用static关键字通过类名称调用,并且静态属性在类加载时只初始化一次,产生一个实例化对象。
static Singleton singleton = new Singleton();
第四,类中属性使用private封装,并提供一个static的geter()方法。
类中属性被private封装后,想取得其属性应提供geter()方法,而此时访问static属性,因为static方法不受对象实例化控制,因此应提供一个static的geter()方法。
class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){};
public static Singleton getSingleton(){
return singleton;
};
public void printO(){
System.out.println("Helloworld");
}
}
第五,使用final关键字,在整体操作中只产生唯一一个实例化对象。
最终得到饿汉式:
class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){};
public static Singleton getSingleton(){
return singleton;
};
public void printO(){
System.out.println("Helloworld");
}
}
public class SingletonTest{
public static void main(String[]args){
Singleton singleton = Singleton.getSingleton();
singleton.print();
}
}
懒汉式单例:
特点: 当第一次使用Singleton对象时才会为其产生实例化对象的操作。
class Singleton{
private static Singleton singleton;
private Singleton(){};//private声明构造
public static Singleton getSingleton() {
if (singleton == null){//表示此时还没有实例化
singleton = new Singleton();
}
return singleton;
}
public void print(){
System.out.println("Helloworld");
}
}
public class SingletonTest{
public static void main(String[]args){
Singleton singleton = Singleton.getSingleton();
singleton.print();
}
}