2014-05-18 3 views
20

패턴의 Enum 버전을 구현하는 방법을 모르겠다. 아래는 Singleton 패턴을 사용하여 "전통적인"접근법을 구현 한 예입니다. 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

"enum version"이란 무엇을 의미합니까? – kviiri

+1

Enum을 사용하는 Singleton 패턴을 구현하는 또 다른 형태는 java 1.5에 도입되었습니다. –

+0

덕분에 지금 당신이 의미하는 것을 볼 수 있습니다. 이 링크를보십시오 : http://stackoverflow.com/questions/18425693/how-does-an-enum-singleton-function – kviiri

답변

30
public enum WirelessSensorFactory { 
    INSTANCE; 

    // all the methods you want 
} 

는 여기 싱글입니다.

이 싱글 톤은 스레드로부터 안전하지만, 그렇지 않은 경우 두 스레드가 경쟁 조건이나 가시성 문제로 진행될 수 있으며 둘 다 자신의 싱글 톤 인스턴스를 생성 할 수 있습니다.

+0

고마워, 그럼 어떻게 main 클래스 안에서이 클래스를 사용할 수 있을까? –

+2

다른 열거 형과 마찬가지로 : WirelessSensorFactory.INSTANCE.someMethod() –

+0

예, 클래스의 인스턴스 하나만 사용할 수 있습니다. 멀티 톤도 같은 방식으로 구현 되었습니까? –

1

는 여기에 설명 : http://javarevisited.blogspot.sk/2012/07/why-enum-singleton-are-better-in-java.html 그래서,이 같은 수행 간단 할 수있다 :

public enum EasySingleton{ 
    INSTANCE; 
} 

과 추상 팩토리 디자인 패턴 사용으로 : 유효의

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

온라인 참조 Java Chapter 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 
     */ 

} 

사용법 : 표준 패턴이 당신의 열거가 인터페이스를 구현하는 것입니다

WirelessSensorFactory.INSTANCE.<any public method> 
+0

고마워, 그럼 어떻게 main 메서드 내에서이 클래스를 사용합니까? –

+0

@ RNI2013 예제 사용법이 포함되어 있습니다. – hovanessyan

14

- 당신은 당신이하는 것보다 배후 기능을 더 이상 노출하지 않아도 이런 식으로 .

// 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

그것은 모든 다른 싱글 창출 버전보다 훨씬 쉽습니다 : -

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

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; 
    } 
} 

이 조각 될 다중 스레드 환경에서 운동 너무 클래스에 잠금을 적용합니다.

+0

잘못되었습니다. 코드는 멀티 스레드 단일 코어 CPU 시스템에서만 작동합니다. 멀티 코어 시스템에서는이 방법이 잘못되었습니다. 쓰기와 읽기 사이에는 "일어난 것"링크가 없습니다. – impeto

+0

singletonInstance가 휘발성을 보장하도록 휘발성이되도록하십시오. – Mitra

+0

예 ... 휘발성이있는 객체가 필요합니다. 개인용 volatile static SingletonClass singletonInstance = null; –