간편한 Java 단일 예제 모드

4491 단어 Java단일 모드
단례 모델은 23가지 디자인 모델 중 가장 간단한 디자인 모델로 기업 개발에서도 특히 많이 응용된다.단례 모델의 장점은 프로젝트에 있고 하나의 실례만 있다는 것이다.
특징: 구조기 사유화, 대상 사유화, 대외 방문 인터페이스 하나만 제공.
장면 적용:
1. 시스템은 자원을 공유해야 한다. 예를 들어 로그 시스템,spring의 자원 관리자 등이다.
2. 자원의 사용을 통제하기 위해: 예를 들어 스레드 탱크
엔터프라이즈급 개발 및 공통 프레임워크의 공통 응용 프로그램:
J2EE의 servlet, Spring의 자원 관리자(즉 beans), 데이터베이스 연결 탱크, 스레드 탱크, 로그 시스템, 사이트 계수기 등
단일 모드 분류:
1. 굶주린 모드: 굶주린 모드는 코드의 가장 간단한 단례 모드이지만 실례는 클래스가 초기화될 때 불러옵니다. 즉시 사용하지 않는 상황에서 시스템의 불러오는 속도를 느리게 합니다. 구체적인 코드는 다음과 같습니다.

public class Singleton{
 private static Singleton instance = new Singleton();
 
 private Singleton(){}
 
 public static Singleton getInstance(){
 return instance;
 }
}
2. 게으름뱅이 모델: 게으름뱅이 모델은 굶주린 모델에 비해 실례화된 유일한 대외 인터페이스에 놓고 처리하여 로드 지연을 실현하고 시스템 초기화 시간을 절약했지만 라인이 안전하지 않은 상황이 존재한다.

public class Singleton{
 private static Singleton instance = null;
 
 private Singleton(){}
 
 public static Singleton getInstance(){
 if(instance == null){
  return new Singleton();
 }
 return instance;
 }
}
3. 이중 검사 자물쇠: 이중 검사 자물쇠 모드는 사실 게으른 모드의 업그레이드로 게으른 모드를 안전하게 한다.주의: 이중 검사 자물쇠에 메모리 문제가 존재하여 이중 검사 자물쇠가 효력을 상실할 수 있습니다.

public class Singleton{
 private static Singleton instance = null;
 
 private Singleton(){}
 
 public static Singleton getInstance(){
 if(instance == null){
  synchronized(Singleton.class){
  if(instance == null){
   return new Singleton();
  }
  }
 }
 return instance;
 }
}
4. 정적 내부 클래스 모델: 정적 내부 클래스는 게으름뱅이 모델과 악한 모델을 겸비하고 있다.

public class Singleton{
 private static class SingletonFactory{
 private static Singleton INSTANCE = new Singleton();
 }
 
 private Singleton(){}
 
 public static Singleton getInstance(){
 return SingletonFactory.INSTANCE;
 }
}
5. 매거류 모델: 가장 완벽한 단리 모델이어야 한다. 라인이 안전할 뿐만 아니라 반서열과 반사 문제를 방지할 수 있다.

enum Singleton{
 INSTANCE;
 
 public void doSomething(){
 ...
 }
}


단일 예제 모드 세부화 문제:
1. 반사 타파 단일 모드: 반사를 통해 단일 모드의 실현을 파괴할 수 있다(매거진 모드 제외)

/**
 *  
 */
public class Demo01 {

 public static void main(String[] args) throws Exception {
 Singleton s1 = Singleton.getInstance();
 Singleton s2 = Singleton.getInstance();
 
 System.out.println(s1 == s2);
 
 Class<Singleton> clazz = (Class<Singleton>) Class.forName("com.singleton.Singleton");
 Constructor<Singleton> constructor = clazz.getDeclaredConstructor(null);
 constructor.setAccessible(true);
 Singleton s3 = constructor.newInstance();
 
 System.out.println(s1 == s3);
 }
}

class Singleton{
 private static Singleton instance = new Singleton();
 
 private Singleton(){
 // , 
// if(instance != null){
//  throw new RuntimeException();
// }
 }
 
 public static Singleton getInstance(){
 return instance;
 }
}

사실 방지란 반사를 통해 만들 수 없게 하는 것이다.
2. 반서열화 타파 단일 모드(매거류 모드 제외)

/**
 *  
 */
public class Demo02 {

 public static void main(String[] args) throws Exception {
 Singleton s1 = Singleton.getInstance();
 Singleton s2 = Singleton.getInstance();
 
 System.out.println(s1 == s2);
 
 FileOutputStream fos = new FileOutputStream("d://test.txt");
 ObjectOutputStream oos = new ObjectOutputStream(fos);
 oos.writeObject(s1);
 
 oos.close();
 fos.close();
 
 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d://test.txt"));
 Singleton s3 = (Singleton) ois.readObject();
 
 System.out.println(s1 == s3);
 }
}
class Singleton implements Serializable{
 private static Singleton instance = new Singleton();
 
 public static Singleton getInstance(){
 return instance;
 }
 
 // , , 
// private Object readResolve() throws ObjectStreamException{
// return instance;
// 
// }
}
이 두 가지 상황은 이해에만 한정되어 실제 개발 과정에서 많이 사용되지 않는다.
이로써 단일 모드는 완전하다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기