Java 单例设计模式

单例设计模式

所谓的单例设计模式,就是指一个类只能实例化一个对象

范例:一个简单的程序

class Singleton{
    public void print() {
        System.out.println("Hello World");
    }
}
 class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton = null ; // 声明对象
           singleton = new Singleton() ; // 实例化对象
           singleton.print();
    }
}

以上程序在进行对象实例化的时候调用了Singleton的无参构造。

使用private修饰声明构造方法

class Singleton{  
  private Singleton() { 
// private声明构造 
   }  
  public void print() {  
      System.out.println("Hello World"); 
   }
 }
 

这个时候类中已经明确的提供了一个私有的构造方法,那么默认生成的无参构造不再产生,此时进行对象实例化的 时候一定会有错误。

一旦构造方法被私有化了,表示外部无法调用构造即外部不能够产生新的实例化对象。此时的类是一个相对而言封 闭的状态。
如果此时还想继续调用Singleton类的print()方法,那么必须提供实例化对象。考虑到封装的特点,可以在类的内部 产生一个实例化对象。

范例:在类的内部产生实例化对象

class Singleton{
    // 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
   Singleton instance = new Singleton() ;
   private Singleton() {
       // private声明构造
       }
       public void print() {
       System.out.println("Hello World");
   }
}

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

范例:使用static产生实例化对象

class Singleton{
    // 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
  static Singleton instance = new Singleton() ;
  private Singleton() {
      // private声明构造
        }
        public void print() {
      System.out.println("Hello World");
  }
}
 class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton = null ;
        // 声明对象
           singleton = Singleton.instance ;
           singleton.print();
    }
}
  

 

以上虽然可以取得Singleton类的实例化对象,但是对于类中属性应该使用private进行封装,要想取得private属 性,应该提供getter()方法。由于此时访问的是static属性,并且这个类无法在外部提供实例化对象,因此应该提供 一个static的getter()方法,因为static方法也不受对象实例化控制。 

范例:static的getter()方法

class Singleton{
    // 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
   private static Singleton instance = new Singleton() ;
   private Singleton() {
       // private声明构造
         }
         public static Singleton getInstance() {
       return instance ;
   }
   public void print() {
       System.out.println("Hello World");
   }
}
 class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton = null ; // 声明对象
            singleton = Singleton.getInstance() ;
            singleton.print();
    }
}

这样做到底要干哈???????
只希望类中产生唯一的一个实例化对象
对于单例设计模式也有两类形式:懒汉式、饿汉式。
上面的代码实际上就是饿汉式的应用。不管你是否使用Singleton类的对象,只要该类加载了,那么一定会自动创 建好一个公共的instance对象。既然是饿汉式,就希望整体的操作之中只能够有一个实例化对象,所以一般还会在 前面追加一个final关键字

范例:饿汉式单例模式

class Singleton{
    // 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
      private final static Singleton INSTANCE = new Singleton() ;
      private Singleton() {
          // private声明构造
           }
           public static Singleton getInstance() {
          return INSTANCE ;
      }
      public void print() {
          System.out.println("Hello World");
      }
      }

class SingletonTest {
     public static void main(String[] args) {
         Singleton singleton = null; // 声明对象
         singleton = Singleton.getInstance();
         singleton.print();

     }
 }

 

请编写一个单例程序,并说明程序的主要特点。
特点:构造方法私有化,外部无法产生新的实例化对象,只能通过static方法取得实例化对象
范例:懒汉式单例模式
特点:当第一次去使用Singleton对象的时候才会为其产生实例化对象的操作

 

懒汉式单例

class Singleton{
    private static Singleton instance ;
    private Singleton() {
        // private声明构造
         }
         public static Singleton getInstance() {
        if (instance==null) {
            // 表示此时还没有实例化
                    instance = new Singleton() ;
        }        return instance ;
    }
    public void print() {
        System.out.println("Hello World");
    }
}
class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton = null ; // 声明对象
           singleton = Singleton.getInstance() ;
           singleton.print();
    }
}

 

( 缺点:无法处理多线程并发,虽然可以加上synchronized关键字,但是效率很低,懒汉式存在多线程安全问题,而饿汉式不会。)
单例模式是一个重点,重点,重点。虽然代码量不大,但是概念用到的很多。
posted @ 2019-03-25 00:25  何浩源  阅读(325)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中