다른 향 원 모드 (디자인 모드 4)

4263 단어
머리말
향 원 모델 은 표면적 으로 공유 단원 이라는 뜻 으로 구조 형 디자인 모델 에 속한다.어?good 아, 지금 은 공유 문화 가 높 고 공유 하면 많은 자원 을 절약 할 것 입 니 다. 사용 하 는 곳 이 많 을 것 입 니 다. 하지만 많 지 않 지만 없어 서 는 안 되 거나 없어 서 는 안 되 는 모델 입 니 다.왜 그런 지 본문 부분 을 보면 왜 사용 하 는 곳 이 많 지 않 은 지, 아니면 왜 사용 하지 말 아야 하 는 지 계산 을 통 해 분석 하 는 동시에 왜 구조 형 에 속 하 는 지, 도대체 구조 형 에 속 하 는 지 알 수 있다.
운전 트리거
구조 형 이 무엇 인지 소개 합 니 다. 구조 형 모델 은 유형 과 대상 을 어떻게 결합 시 켜 더욱 큰 구 조 를 형성 하 는 지 설명 합 니 다. 이 는 두 가지 서로 다른 사물 을 묘사 합 니 다. 유형 과 대상 은 이런 점 에 따라 유형 구조 형 과 대상 구조 형 모델 로 나 눌 수 있 습 니 다.유형 구조 형 모델 관심 류 의 조합 은 여러 가지 유형 에서 더욱 큰 시스템 으로 조합 할 수 있 고 유형 구조 형 모델 에서 상속 관계 와 실현 관계 만 존재 한다.대상 구조 형 모델 은 클래스 와 대상 의 조합 에 관심 을 가지 고 관련 관 계 를 통 해 한 클래스 에서 다른 클래스 의 인 스 턴 스 대상 을 정의 한 다음 에 이 대상 을 통 해 그 방법 을 호출 합 니 다.'합성 복용 원칙' 에 따라 시스템 에서 가능 한 한 관련 관 계 를 사용 하여 계승 관 계 를 대체 하기 때문에 대부분의 구조 형 모델 은 대상 구조 형 모델 이다.자, 먼저 구조 형 에 대해 작은 개념 을 가지 고 출발 합 시다.Font, 글꼴 클래스 가 있 습 니 다.
public class Font
{
    // unique
    private string key;
    //      
    private int size;
    //      
    private string color;
    public Font(string key, int size,string color)
    {
        this.key = key;
        this.size = size;
        this.color = color;
    }
}

글꼴 을 렌 더 링 하 는 정적 클래스
public static class render
{
    public static void renderFont(char a,Font font) {
        //      
    }
}

main 호출
static void Main(string[] args)
{
    Font fontx = new Font("xxx",12,"red");
    render.renderFont('a',fontx);
    Font fonty = new Font("yyy", 13, "red");
    render.renderFont('b',fonty);
    Font fontx2 = new Font("xxx", 12, "red");
    render.renderFont('c',fontx2);
}

main 에서 자세히 보면 내 가 똑 같은 두 가 지 를 과장 한 것 을 발견 할 수 있 습 니 다.
Font fontx = new Font("xxx",12,"red");

이것 은 렌 더 링 과정 을 설명 하 는 것 입 니 다. 예 를 들 어 우리 가 글 을 렌 더 링 할 때 하나의 출력 입 니 다. 다음 에 무엇 을 출력 해 야 할 지, 그의 글꼴 유형 이 무엇 인지 전혀 모 릅 니 다.위 에서 설명 한 과정 은 현재 글꼴 형식 이 fontx 입 니 다. 저 는 a 를 쓴 다음 에 글꼴 fonty 를 사용 하여 b 를 설명 합 니 다. 마지막 으로 저 는 글꼴 fontx 2 (fontx 와 같은 설정) 로 c 를 렌 더 링 합 니 다.이러 다 무슨 문제 가 생 길 까?10 만 자 를 과장 해 야 한다 고 가정 하 세 요.Font 인 스 턴 스 가 몇 개의 byte 를 차지 하 는 지 알 아 보 세 요.Font 머리 에 StructLayout 를 추가 하여 structLayout 에 따라 정렬 합 니 다. 그렇지 않 으 면 크기 를 얻 을 수 없습니다.
[StructLayout(LayoutKind.Sequential)]
public class Font

그리고 호출:
Font fontx = new Font("xxx",12,"red");
unsafe {
    var byteSize = Marshal.SizeOf(fontx);
    Console.WriteLine("    ");
}

검색 결 과 는 24 바이트 입 니 다.계산 시작: 24byte * 110 ^ 6 = 2.410 ^ 7 / 1024 / 1024 = 2.410 ^ 7 / (1.04857610 ^ 6) 은 약 24m 입 니 다. 즉, 제 가 10w 자 를 렌 더 링 하려 면 24m 메모리 가 필요 하 다 고 가정 하면 최적화 가 필요 합 니 다.그럼 공장 류 를 하나 더 합 시다.
public class FontFactory
{
    private Hashtable flyweights = new Hashtable();

    public Font getFont(string key,int size,string color) {
        if (!flyweights.ContainsKey(key))
        {
            flyweights.Add(key,new Font(key,size,color));
        }
        return (Font)flyweights[key];
    }
}

호출:
static void Main(string[] args)
{
    FontFactory fontFactory = new FontFactory();
    Font fontx = fontFactory.getFont("xxx",12,"red");
    Font fonty = fontFactory.getFont("yyy", 13, "red");
}

하나의 font 를 통 해 공장 을 만 들 고 있 으 면 추출 하고 없 으 면 생 성 한 다음 에 돌아 갑 니 다.그러나 앞에서 언급 했 듯 이 이런 모델 은 적 게 사용 된다.왜 그 랬 어 요?우선, FontFactory 의 메커니즘 은 우리 의 cpu 와 무시 할 수 없 는 메모리 의 일 부 를 소모 해 야 합 니 다.만약 발생 하 는 대상 이 몇 k 밖 에 소모 되 지 않 는 다 면 이런 최 적 화 는 거의 의미 가 없다.두 번 째 는 생산 된 Font 이 읽 기 전용 에 맞 아야 한 다 는 것 을 볼 수 있 는데 왜 읽 기만 합 니까?수정 이 필요 하 다 면 이 문 제 를 만 나 지 못 하고 수정 하지 않 는 이 유 는 수정 에 소모 가 많다.그래서 장면 이 많 지 는 않 지만 서버 쪽 에 서 는 그렇게 많은 곳 에서 사용 합 니 다.주: 장면 과 사용 하 는 곳 은 개념 이 아 닙 니 다.마지막 으로 대상 구조 형의 개념 을 살 펴 보 자.대상 구조 형 모델 은 클래스 와 대상 의 조합 에 관심 을 가지 고 관련 관 계 를 통 해 한 클래스 에서 다른 클래스 의 인 스 턴 스 대상 을 정의 한 다음 에 이 대상 을 통 해 그 방법 을 호출 합 니 다.'합성 복용 원칙' 에 따라 시스템 에서 가능 한 한 관련 관 계 를 사용 하여 계승 관 계 를 대체 하기 때문에 대부분의 구조 형 모델 은 대상 구조 형 모델 이다.이런 모델 의 개념 에 딱 맞 는 것 은 자명 하 다.
uml 그림
후속 보충
총결산
향 원 은 주로 생 성 대상 의 수량 을 줄 여 메모리 사용량 을 줄 이 고 성능 을 향상 시 키 는 데 사용 된다.장면: 특히 많은 대상 이 발생 하여 너무 많은 메모 리 를 소모 하 는 상황 이 발생 합 니 다.

좋은 웹페이지 즐겨찾기