디자인 모드 - 단일 모드 학습 노트 및 깨 달 음

35498 단어 디자인 모드
단일 모드
단일 모드 정의
   
하나의 클래스 가 하나의 인 스 턴 스 만 있 는 지 확인 하고 자체 적 으로 예화 하여 전체 시스템 에 이 인 스 턴 스 를 제공 합 니 다.
    유 니 버 설 코드 는 다음 과 같다.
/ / 굶 주 린 한 예 모드public class Singleton{ private static final Singleton singleton = new Singleton(); // private Singleton(){} // public static Singleton getSingleton(){ return single; } // , static }
단일 모드 의 장점
    1. 메모리 에 하나의 인 스 턴 스 만 있 고 메모리 의 지출 을 줄 였 습 니 다. 특히 한 대상 이 빈번 한 생 성, 소각 이 필요 할 때 생 성 또는 소각 시 성능 이 최적화 되 지 못 할 때 그 장점 이 뚜렷 합 니 다.
    2. 시스템 성능 비용 을 줄 였 다.한 대상 이 발생 할 때 비교적 많은 자원 을 소모 해 야 할 때 응용 을 시작 할 때 하나의 단일 대상 을 직접 만들어 영구적 으로 메모리 에 머 무 르 는 방식 으로 해결 할 수 있다.
    3. 자원 에 대한 다 중 점용 을 피하 고 한 자원 에 대해 여러 가지 충돌 작업 을 하지 않도록 한다.
    4. 단일 모드 는 시스템 에서 전체적인 방문 점 을 설정 하고 자원 방문 을 최적화 하고 공유 할 수 있다.예 를 들 어 cocos2dx 의 감독 류 인 CCDirector 는 인터넷 에서 찾 아 낸 이런 기능 은 다음 과 같다.
    
    OpenGL 렌 더 링 창 과 게임 장면 을 초기 화 하 는 프로 세 스 제 어 를 관리 합 니 다. 이것 은 cocos2dx 게임 개발 에서 없어 서 는 안 될 클래스 중 하나 입 니 다.왜 이런 것들 을 하나의 대상 으로 설계 해 야 합 니까?하나의 게임 은 하나의 게임 창 만 있 으 면 되 기 때문에 OpenGL 렌 더 링 창 을 한 번 만 초기 화해 야 합 니 다.그리고 장면 의 절차 통제 기능 도 이런 장면 통제 대상 만 존재 하면 된다.CCDirector 클래스 에 하나의 인 스 턴 스 대상 만 존재 하도록 하기 위해 서 는 단일 모드 를 사용 해 야 합 니 다.
단일 모드 의 단점
    1. 단일 모드 는 일반적으로 인터페이스 가 없어 서 확장 이 어렵 습 니 다. 확장 하려 면 기본적으로 코드 를 수정 하 는 것 입 니 다.그 렇 기 때문에 단일 모드 는 인 터 페 이 스 를 추가 할 수 없습니다. 인 터 페 이 스 는 단일 모드 에 아무런 의미 가 없 기 때문에 '자체 예화' 를 요구 하고 단일 인 스 턴 스 를 제공 합 니 다.인터페이스 나 추상 은 실례 화 될 수 없다.특수 한 상황 에서 단일 모델 은 인터페이스, 계승 등 을 실현 할 수 있 기 때문에 실제 상황 에서 판단 해 야 한다.
    2. 단일 모드 는 테스트 에 불리 하고 단일 사례 가 완성 되 기 전에 테스트 를 할 수 없 으 며 인터페이스 가 없 으 면 mock 방식 으로 대상 을 가상 할 수 없다.
    
mock 테스트 는 테스트 과정 에서 쉽게 구성 되 지 않 거나 쉽게 얻 을 수 없 는 대상 에 대해 가상 대상 으로 테스트 할 수 있 는 테스트 방법 을 만 드 는 것 입 니 다.http://baike.baidu.com/view/2445748.htm?fr=aladdin
   
 3. 단일 사례 모델 과 단일 직책 원칙 이 충돌 합 니 다.한 가지 유형 은 하나의 논리 만 실현 해 야 하 며, 그것 이 하나의 사례 인지 아 닌 지 는 환경 에 달 려 있다. 하나의 사례 모델 은 '하나의 사례' 와 업무 논 리 를 한 가지 유형 에 융합 시 켜 야 한다.
단일 모드 적용
    1. 유일한 식별 자 를 만 드 는 환경 을 요구한다.
    2. 전체 프로젝트 에 공유 액세스 점 이나 데 이 터 를 공유 해 야 합 니 다. 예 를 들 어 웹 페이지 의 카운터 가 필요 합 니 다. 새로 고침 할 때마다 데이터 베이스 에 기록 하지 않 고 단일 모드 로 카운터 의 값 을 유지 하 며 스 레 드 가 안전 하도록 확보 할 수 있 습 니 다.
    3. 대상 을 만 드 는 데 소모 되 는 자원 이 너무 많다.
    4. 대량의 정적 상수 와 정적 방법 (예 를 들 어 도구 류) 의 환경 을 정의 해 야 합 니 다. 단일 모드 를 사용 할 수도 있 고 static 방식 으로 직접 설명 할 수도 있 습 니 다.
    
    다음은 정적 클래스 와 단일 모델 에 대한 토론 입 니 다. 2004 년 csdn 포럼 의 오래된 게시 물이 있 습 니 다.http://bbs.csdn.net/topics/50351608
    
    
    제 가 실제 에서 가장 자주 사용 하 는 정적 류 는 도구 류 입 니 다. 불변 류 의 정의 와 유사 합 니 다. 클래스 에 변수 가 없 는 것 은 상수 이 고 일부 방법 만 제공 합 니 다. 상태 에 따라 달라 지지 않 습 니 다.그리고 정적 방법 이 끝나 면 그 중의 부분 변 수 는 jvm 쓰레기 에 의 해 회수 된다.

    
    
    단일 클래스 는 상 태 를 포함 하고 일반적으로 공유 해 야 하 는 자원, 예 를 들 어 시스템 설정 정보 등 이다.불변 류 를 일례 류 로 설계 하 는 것 은 일례 모델 에서 가장 흔히 볼 수 있 는 남용 이다.
주의 사항
    1. 높 은 병발 상황 에서 단일 모드 의 스 레 드 동기 화 문 제 를 주의해 야 한다.// public class Singleton{ private static Singleton singleton = null; // private Singleton(){} // public Singleton getSingleton(){ if(singleton == null){ singleton = new Singleton(); } return singleton; } } /* , , 。 A singleton = new Singleton(), , B if ,singleton null, if , 。 */
    
개선, 게다가 synchronized, 이 개선 형 은 게으름뱅이 식 단일 사례 라 고도 부 릅 니 다. 코드 는 다음 과 같 지만 가장 우수한 것 은 아 닙 니 다.굶 주 린 한 예 모드 사용 을 추천 합 니 다.// public class Singleton{ private static Singleton singleton = null; // private Singleton(){} // public synchronized Singleton getSingleton(){ if(singleton == null){ singleton = new Singleton(); } return singleton; } }
    
굶 주 린 남자//file Singleton.java package parctice;   public class Singleton { private static final Singleton singleton = new Singleton(); private static int i = 1; private Singleton(){ this.i++; } public static Singleton getInstance(){ return singleton; } public static int getI(){ return i; } }   //file ThreadTest.java package parctice;   public class ThreadTest { public static void main(String[] args){ Thread t1 = new Thread(new MyRunnable1()); Thread t2 = new Thread(new MyRunnable2()); t1.start(); t2.start(); } } class MyRunnable1 implements Runnable{   @Override public void run() { // TODO Auto-generated method stub Singleton s = Singleton.getInstance(); System.out.println(" MyRunnable1 -- " + s.getI()); } } class MyRunnable2 implements Runnable{   @Override public void run() { // TODO Auto-generated method stub Singleton s = Singleton.getInstance(); System.out.println(" MyRunnable2 -- " + s.getI()); } }
결과 캡 처
 static 정적 변수, 정적 방법 복습
메모리
4 개 부분 (stack segment, heap segment, code segment, data segment)
프로그램 에서 부분 변 수 를 설명 할 때 이 변 수 는 stack segment (스 택) 에 저 장 됩 니 다.
new 대상 이 있 을 때 이 대상 은 힙 segment (더미) 에 놓 여 있 습 니 다.
static 의 변수 나 문자열 상수 가 data segment (데이터 영역) 에 존재 합 니 다.
그렇다면 클래스 의 방법 은 code segment (코드 영역) 에 존재 합 니 다.
    
클래스 Singleton 불 러 올 때 static 형식의 singleton 변 수 는 data segment 에 존재 합 니 다. 클래스 Singleton 의 예화 에 따라 heap segment 에 나타 나 는 것 이 아 닙 니 다.다른 코드 에서 호출 될 때 항상 호출 됩 니 다. data segment 에 저 장 된 유일한 변수 singleton 이 므 로 대상 은 하나의 예 로 보 장 됩 니 다.
단일 모드 확장// public class Singleton{ private static final Singleton singleton = new Singleton(); // private static int maxNumOfSingleton = 5; // private static ArrayList<Singleton> sinArr = new ArrayList<Singleton>(); // static{ for(int i=0;i<maxNumOfSingleton ;i++){ sinArr.add(new Singleton()); } } // private Singleton(){} // public static Singleton getSingleton(int index){ return sinArr.get(index); } }

좋은 웹페이지 즐겨찾기