zoukankan      html  css  js  c++  java
  • 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关键字,但是效率很低,懒汉式存在多线程安全问题,而饿汉式不会。)
    单例模式是一个重点,重点,重点。虽然代码量不大,但是概念用到的很多。
  • 相关阅读:
    《DSP using MATLAB》Problem 6.17
    一些老物件
    《DSP using MATLAB》Problem 6.16
    《DSP using MATLAB》Problem 6.15
    《DSP using MATLAB》Problem 6.14
    《DSP using MATLAB》Problem 6.13
    《DSP using MATLAB》Problem 6.12
    《DSP using MATLAB》Problem 6.11
    P1414 又是毕业季II
    Trie树
  • 原文地址:https://www.cnblogs.com/hetaoyuan/p/10587783.html
Copyright © 2011-2022 走看看