Java学习——单例模式

单例模式


特点:一个类只允许产生一个实例化对象

一个普通的类我们可以new出多个实例化对象,如何才能限制对象的个数呢?

产生对象的本质是我们调用了类的构造方法,如果我们无法调用构造方法不就不会产生实例化对象了吗?最容易想到的就是将类的构造方法私有化。一旦构造方法被私有化了,表示外部无法调用构造即外部不能够产生新的实例化对象。此时的类是一个相对而言封闭的状态。但是我们还需要一个实例化对象啊,那么我们可以在类中调用构造方法产生一个实例化对象,再通过静态方法将这个对象返回给想要实例化对象的地方就行了。

对于单例设计模式也有两类形式:懒汉式、饿汉式。

饿汉式单例

//饿汉式单例_先new为敬
class Singleton{
    private static final Singleton SINGLETON = new Singleton();//类内部实例化一个对象
    private Singleton(){}//构造方法私有化
    public static Singleton getSingleton(){//通过get方法返回
        return SINGLETON;
    }
    public void test(){
        System.out.println("This is singleton" + this);
    }
}

public class Test {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getSingleton();
        singleton.test();
    }
}

为什么要使用static关键字修饰SINGLETON呢?

现在Singleton内部的SINGLETON对象(属性)是一个普通属性,所有的普通属性必须在有实例化对象的时候才能进行内存空间的分配,而现在外部无法产生实例化对象,所以必须想一个办法,可以在Singleton没有实例化对象产生的时候,也可以将SINGLETON进行使用。此时,联想到使用static关键字。

上面的代码实际上就是饿汉式的应用。不管你是否使用Singleton类的对象,只要该类加载了,那么一定会自动创建好一个公共的SINGLETON对象。既然是饿汉式,就希望整体的操作之中只能够有一个实例化对象,所以一般还会在前面追加一个final关键字。

懒汉式单例

//懒汉式单例——用时再new
class Singleton{
    private static  Singleton SINGLETON ;//类内部实例化一个对象
    private Singleton(){}//构造方法私有化
    public static Singleton getSingleton(){//通过get方法返回
        //延迟加载
        if(SINGLETON == null){
            SINGLETON = new Singleton();
        }
        return SINGLETON;
    }
    public void test(){
        System.out.println("This is singleton" + this);
    }
}
public class Test {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getSingleton();
        singleton.test();
    }
}

懒汉式单例的特点是:当第一次去使用Singleton对象的时候才会为其产生实例化对象的操作.

注意:懒汉式单例存在线程安全问题(解决方法:双重加锁单例模式)

无论单例还是多例,其特点为:

1.构造方法私有化

2.类内部提供静态方法返回有限个数对象

猜你喜欢

转载自blog.csdn.net/eve8888888/article/details/83512185