2014-05-18 20 views
20

Tôi không hiểu cách triển khai Phiên bản Enum của mẫu Singleton. Dưới đây là ví dụ về cách triển khai phương pháp "truyền thống" sử dụng mẫu Singleton. Tôi muốn thay đổi nó để sử dụng phiên bản Enum nhưng tôi không chắc chắn như thế nào.Mẫu Singleton: Sử dụng Phiên bản Enum

public class WirelessSensorFactory implements ISensorFactory{ 

    private static WirelessSensorFactory wirelessSensorFactory; 

    //Private Const 
    private WirelessSensorFactory(){ 
     System.out.println("WIRELESS SENSOR FACTORY"); 
    } 

    public static WirelessSensorFactory getWirelessFactory(){ 

     if(wirelessSensorFactory==null){ 
      wirelessSensorFactory= new WirelessSensorFactory(); 
     } 

     return wirelessSensorFactory; 
    } 

} 
+0

Bạn có ý nghĩa gì với "phiên bản enum"? – kviiri

+1

Một dạng khác của việc triển khai mẫu Singleton bằng cách sử dụng một Enum, nó đã được giới thiệu trong java 1,5 –

+0

nhờ bây giờ tôi thấy ý của bạn là gì. Hãy thử liên kết này: http://stackoverflow.com/questions/18425693/how-does-an-enum-singleton-function – kviiri

Trả lời

30
public enum WirelessSensorFactory { 
    INSTANCE; 

    // all the methods you want 
} 

Dưới đây là singleton của bạn: một enum chỉ với một ví dụ. Lưu ý rằng singleton này là an toàn thread, trong khi của bạn không phải là: hai chủ đề có thể cả hai đi vào một điều kiện chủng tộc hoặc vấn đề tầm nhìn và cả hai tạo ra trường hợp riêng của họ về singleton của bạn.

+0

Cảm ơn, Làm thế nào tôi có thể sử dụng lớp này trong một phương pháp chính? –

+2

Như bất kỳ điều kiện nào khác: WirelessSensorFactory.INSTANCE.someMethod() –

+0

Vâng, vì vậy chỉ có một thể hiện của lớp chỉ có thể được sử dụng, là một multiton được thực hiện theo cùng một cách? –

1

Nó được giải thích ở đây: http://javarevisited.blogspot.sk/2012/07/why-enum-singleton-are-better-in-java.html Vì vậy, nó có thể đơn giản được thực hiện như thế này:

public enum EasySingleton{ 
    INSTANCE; 
} 

và cũng với việc sử dụng trừu tượng mẫu thiết kế nhà máy:

public class Singleton{ 
    //initailzed during class loading 
    private static final Singleton INSTANCE = new Singleton(); 

    //to prevent creating another instance of Singleton 
    private Singleton(){} 

    public static Singleton getSingleton(){ 
     return INSTANCE; 
    } 
} 
4

tham khảo trực tuyến của hiệu quả Chương Java here.

public enum WirelessSensorFactory implements ISensorFactory { // change CLASS to ENUM here 

     INSTANCE; //declare INSTANCE of the Enum 

     //private static WirelessSensorFactory wirelessSensorFactory; 

     // Remove the private construct - it's Enum, 
     // so you don't need to protect instantiations of the class 
      //private WirelessSensorFactory(){ 
      // System.out.println("WIRELESS SENSOR FACTORY"); 
      //} 

     // You don't need to check if instance is already created, 
     // because it's Enum, hence you don't need the static var 
      //public WirelessSensorFactory getWirelessFactory(){ 
      // if(wirelessSensorFactory==null){ 
      //  wirelessSensorFactory= new WirelessSensorFactory(); 
      // } 
      // return wirelessSensorFactory; 
      //} 

     /* 
     * All other methods you need and 
     * implementation of all the Factory methods from your interface 
     */ 

} 

Cách sử dụng:

WirelessSensorFactory.INSTANCE.<any public method> 
+0

Cảm ơn, Làm thế nào tôi có thể sử dụng lớp này trong một phương pháp chính? –

+0

@ RNI2013 Tôi đã sử dụng ví dụ. – hovanessyan

14

Các mô hình tiêu chuẩn là phải có enum của bạn thực hiện một giao diện - cách này bạn không cần để lộ bất kỳ chi tiết của các chức năng đằng sau hậu trường hơn là bạn phải .

// Define what the singleton must do. 
public interface MySingleton { 

    public void doSomething(); 
} 

private enum Singleton implements MySingleton { 

    /** 
    * The one and only instance of the singleton. 
    * 
    * By definition as an enum there MUST be only one of these and it is inherently thread-safe. 
    */ 
    INSTANCE { 

       @Override 
       public void doSomething() { 
        // What it does. 
       } 

      }; 
} 

public static MySingleton getInstance() { 
    return Singleton.INSTANCE; 
} 
0

Nó là dễ dàng hơn nhiều so với tất cả các phiên bản tạo Singleton khác: -

public enum WirelessSensorFactory { 

     INSTANCE; 

     //private static WirelessSensorFactory wirelessSensorFactory; 

     //Private Const 
     //private WirelessSensorFactory(){ 

      //System.out.println("WIRELESS SENSOR FACTORY"); 

     // } 


     // public static WirelessSensorFactory getWirelessFactory(){ 

      //if(wirelessSensorFactory==null){ 

       // wirelessSensorFactory= new WirelessSensorFactory(); 
      // } 

      // return wirelessSensorFactory; 
     // } 

} 
-1

Tiếp theo là một mẫu của lớp singlton,

public class SingletonClass { 
    private static SingletonClass singletonInstance = null; 

    private SingletonClass() {  
    } 

    public static SingletonClass getSingletonInstance() {  
     if(singletonInstance == null) { 
      synchronized (SingletonClass.class) { 
       if(singletonInstance == null) { 
        singletonInstance = new SingletonClass(); 
       } 
      } 
     } 
     return singletonInstance; 
    } 
} 

đoạn này sẽ tập luyện trong môi trường đa luồng vì nó áp dụng khóa trên lớp.

+0

Điều này là sai. Cách mã là, nó chỉ hoạt động trong các hệ thống CPU lõi SINGLE đa luồng. Trong hệ thống đa lõi, phương pháp này bị lỗi. Không có liên kết "xảy ra-trước" giữa ghi và đọc. – impeto

+0

Làm cho singletonInstance dễ bay hơi để đảm bảo xảy ra trước – Mitra

+0

Vâng ... cần một đối tượng dễ bay hơi, riêng biến động tĩnh SingletonClass singletonInstance = null; –

Các vấn đề liên quan