Java의 단일 예제 모드 상세 정보

5426 단어 java단일 모드
단일 모드 개념:
java에서 단례 모델은 흔히 볼 수 있는 디자인 모델로 단례 모델은 세 가지로 나뉘는데 그것이 바로 게으름뱅이 단례, 굶주린 단례, 등록식 단례 세 가지이다.
단례 모드의 특징은 다음과 같다.
1. 단례류는 하나의 실례만 있을 수 있다.
2. 단례류는 반드시 자신이 자신의 유일한 실례를 만들어야 한다.
3. 단일 클래스는 모든 다른 대상에 이 실례를 제공해야 한다.
단일 모드는 특정한 종류가 하나의 실례만 있고 자체적으로 실례화하여 전체 시스템에 이 실례를 제공한다.컴퓨터 시스템에서 스레드 풀, 캐시, 로그 대상, 대화상자, 프린터, 그래픽 카드의 드라이버 대상은 항상 하나의 예로 설계된다.이런 응용 프로그램들은 모두 많든 적든 자원 관리자의 기능을 가지고 있다.컴퓨터당 몇 개의 프린터가 있을 수 있지만, 두 개의 프린터 작업이 동시에 프린터로 출력되지 않도록 Printer Spooler만 있을 수 있습니다.모든 컴퓨터에는 몇 개의 통신 포트가 있을 수 있으며, 시스템은 하나의 통신 포트가 동시에 두 개의 요청에 의해 호출되는 것을 피하기 위해 이 통신 포트를 집중적으로 관리해야 한다.한 마디로 하면 단례 모델을 선택한 것은 불일치 상태를 피하고 정출을 피하기 위해서다.
우선 고전적인 단례 실현을 보자.

public class Singleton {
  private static Singleton uniqueInstance = null;
 
  private Singleton() {
    // Exists only to defeat instantiation.
  }
 
  public static Singleton getInstance() {
    if (uniqueInstance == null) {
      uniqueInstance = new Singleton();
    }
    return uniqueInstance;
  }
  // Other methods...
}
Singleton은 구조 방법을private로 한정함으로써 클래스가 외부에서 실례화되는 것을 피합니다. 같은 가상 기기 범위 내에서 Singleton의 유일한 실례는 get Instance () 방법으로만 접근할 수 있습니다.(사실상 자바 반사 메커니즘을 통해private 구조의 유형을 실례화할 수 있다. 그러면 기본적으로 모든 자바 단례를 실효시킬 수 있다. 이 문제는 여기서 토론하지 않고 반사 메커니즘이 존재하지 않는다고 눈 가리고 아웅한다.)
그러나 이상의 실현은 라인 안전 문제를 고려하지 않았다.이른바 스레드 보안이란 코드가 있는 프로세스에서 여러 개의 스레드가 동시에 실행되고 있다면, 이 스레드가 이 코드를 동시에 실행할 수 있다는 것을 말한다.만약 매번 운행 결과와 단일 노선이 운행하는 결과가 같고 다른 변수의 값도 예상한 것과 같다면 노선이 안전하다는 것이다.또는: 한 종류나 프로그램이 제공하는 인터페이스는 스레드에 있어 원자 조작이나 여러 스레드 간의 전환으로 인해 이 인터페이스의 실행 결과에 이의성이 존재하지 않는다. 즉, 우리는 동기화 문제를 고려할 필요가 없다.분명히 이상의 실현은 스레드 안전의 요구를 만족시키지 못하기 때문에 병발 환경에서 여러 개의 Singleton 실례가 나타날 가능성이 높다.

public class TestStream {
   private String name;
   public String getName() {
     return name;
   }
   public void setName(String name) {
     this.name = name;
   } 
   // 
   private TestStream(){}  // 
   // 
   // 2 
   /*private static final TestStream ts=new TestStream();*/
   private static TestStream ts1=null;
   // 
   public static TestStream getTest(){
     if(ts1==null){
       ts1=new TestStream();
     }
    return ts1;
   }
   public void getInfo(){
     System.out.println("output message "+name);
   }
 }

 public class TestMain {
   public static void main(String [] args){
     TestStream s=TestStream.getTest();
     s.setName(" ");
    System.out.println(s.getName());
     TestStream s1=TestStream.getTest();
     s1.setName(" ");
     System.out.println(s1.getName());
     s.getInfo();
     s1.getInfo();
     if(s==s1){
       System.out.println(" ");
    }else if(s!=s1){
       System.out.println(" ");
     }else{
       System.out.println("application error");
     }
   }
 }
실행 결과:
장효상
장효상
장효상
장효상
동일한 인스턴스를 생성합니다.
결론: 결과적으로 단일 모드는 대상을 대상으로 하는 응용 프로그램에 대상의 유일한 접근점을 제공했고 어떤 기능을 실현하든지 전체 응용 프로그램은 하나의 실례 대상을 함께 누릴 수 있음을 알 수 있다.
1. 굶주림

// . ,  
 public class Singleton1 {
   // 
   private Singleton1() {}
   //  
   private static final Singleton1 single = new Singleton1();
   //  
   public static Singleton1 getInstance() {
     return single;
   }
 }
 2.게으름뱅이

 // .  
 public class Singleton2 {
   // 
   private Singleton2() {}
   // , final  
   private static Singleton2 single=null;
   //  
   public synchronized static Singleton2 getInstance() {
     if (single == null) { 
       single = new Singleton2();
     } 
    return single;
   }
 }
 3.등록식 단례류

 import java.util.HashMap;
 import java.util.Map;
 // .
 // Spring , , 。
 public class Singleton3 {
   private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
   static{
     Singleton3 single = new Singleton3();
     map.put(single.getClass().getName(), single);
   }
   // 
   protected Singleton3(){}
   // , 
   public static Singleton3 getInstance(String name) {
     if(name == null) {
       name = Singleton3.class.getName();
       System.out.println("name == null"+"--->name="+name);
     }
     if(map.get(name) == null) {
       try {
         map.put(name, (Singleton3) Class.forName(name).newInstance());
       } catch (InstantiationException e) {
         e.printStackTrace();
       } catch (IllegalAccessException e) {
         e.printStackTrace();
       } catch (ClassNotFoundException e) {
         e.printStackTrace();
       }
     }
     return map.get(name);
   }
   // 
   public String about() {  
     return "Hello, I am RegSingleton.";  
   }  
   public static void main(String[] args) {
     Singleton3 single3 = Singleton3.getInstance(null);
    System.out.println(single3.about());
   }
 }
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기