单例设计模式:一个类只允许产生一个实例化对象
示例:
package test;
class Singleton{
public void print(){
System.out.println("这是单例模式");
}
}
public class SingletonTest {
public static void main(String[] args){
Singleton singleton = null;
singleton = new Singleton();
singleton.print();
}
}
注:以上程序进行对象实例化的时候调用了Singleton的无参构造.
若构造方法被私有化,表示外部无法调用构造方法基外部不能产生新的实例化对象.若此时还想调用Singleton类的某些方法,即必须提供实例化对象.考虑到封装的特点,可以在类内部产生一个实例化对象
示例:
package test;
class Singleton{
private static Singleton s = new Singleton();//在Singleton未实例化对象时可以使用
private Singleton(){
}
public static Singleton getS(){
return s;
}//获取私有属性,使用getter();
public void print(){
System.out.println("这是单例模式");
}
}
public class SingletonTest {
public static void main(String[] args){
Singleton singleton = null;
singleton = singleton.getS();
singleton.print();
}
}
单例模式分类:懒汉式 饿汉式
1.饿汉式:
package test;
class Singleton{
private static Singleton s = new Singleton();//在Singleton未实例化对象时可以使用
private Singleton(){
}
public static Singleton getS(){
return s;
}//获取私有属性,使用getter();
public void print(){
System.out.println("这是单例模式");
}
}
public class SingletonTest {
public static void main(String[] args){
Singleton singleton = null;
singleton = singleton.getS();
singleton.print();
}
}
特点:构造方法私有化,外部无法产生新的实例化对象,可以通过static方法取得实例化对象
2.懒汉式:
package test;
class Singleton{
private static Singleton instance;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if (instance==null){
instance = new Singleton();
}
return instance;
}//保证线程的安全
public void print(){
System.out.println("这是懒汉式");
}
}
public class SingletonTest {
public static void main(String[] args){
Singleton singleton = null;
singleton = Singleton.getInstance();
singleton.print();
}
}
懒汉式存在线程不安全的问题,所以我们可以为其加锁(synchronized).