Prototype Pattern(单件模式)
保证一个类仅有一个实例,并提供一个访问它的全局访问点
关键是将该类的构造方法设置为private,并提供一个返回它的唯一实例的类方法(static 方法)
单件类(Singleton)包含如下特点:
1.单间类中包含用自身声明的类变量,这个类变量是单件类中唯一的实例。
2.单件类的构造方法访问权限是private,为了确保单间类中自身声明的类变量是单间唯一的实例,单件类必须将构造方法的访问权限设置为private。这样一来,任何其他类都无法使用单件类来创建对象。
3.单件类负责创建自己唯一的实例,并提供访问改实例的类方法。由于单件类的构造方法被设置为private,所以单件类必须自己负责创建自身声明的实例。为了让用户使用单件类这个唯一实例,单件类必须提供一个类方法,以便其他用户使用单件类的类名就可以调用这个类方法访问使用单件类这个唯一实例。
JAVA中两种设计单件类的方法
1.在JVM加载单件类时创建它的唯一实例。
类被加载到JVM时就会被分配空间,改空间用于存放该实例的引用,所以,可以在声明类时,就创建实例。
public class Singleton
{
private static Singleton uniqueInstance = new Singleton();
private Singleton() //构造方法是private权限
{
//其他
}
//在JVM加载该类时已经创建此唯一的单件实例
public static Singleton getInstance()
{
return uniqueInstance;
}
}
优点:在静态初始化时创建单件,保证了线程安全。
缺点:如果这个对象非常耗费资源,而在程序的执行过程中并没有使用到它,那就造成资源的浪费了。
2.在单件类提供的类方法中创建这个唯一实例
public class Singleton
{
private static Singleton uniqueInstance = new Singleton();
private Singleton() //构造方法是private权限
{
//其他
}
public static synchronized Singleton getInstance()
{
if (uniqueInstance == null)
{
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
在用户希望在需要使用单例实例时创建,为了防止多线程调用类方法时,创建多个单例实体,要将类方法设置为同步方法。
使用synchronized可以迫使每个线程进入该方法前,要先等待其他线程离开该方法(synchronized锁定的是该类对应的Class对象)。
优点:可以防止多线程创建多个单例对象。
缺点:可能会使性能严重降低:只有第一次执行getInstance()方法才需要同步,之后每次调用这个方法,同步都会成为累赘(并行执行改为串行执行),若getInstance()需要被频繁 执行,则性能会大大降低。