C\#프로 그래 밍 에서 디자인 모드 의 원형 모드 를 사용 하 는 실례 설명

9146 단어 C#디자인 모드
머리말
소프트웨어 시스템 에서 하나의 인 스 턴 스 를 만 드 는 과정 이 매우 비 싸 거나 복잡 하 며,이러한 인 스 턴 스 를 여러 개 만들어 야 할 때,만약 우리 가 new 연산 자 를 사용 하여 이러한 인 스 턴 스 를 만 들 면,이러한 인 스 턴 스 를 만 드 는 복잡 도와 더 많은 메모리 공간 을 소모 할 수 밖 에 없다.왜냐하면 메모리 에 같은 인 스 턴 스 대상 을 여러 개 분배 하기 때문이다.그 다음 에 공장 모델 로 이런 시스템 을 만 들 면 제품 류 가 계속 증가 함 에 따라 서브 류 의 수량 이 계속 증가 하고 오히려 시스템 의 복잡 도 를 증가 하기 때문에 여기 서 공장 모델 로 포장 류 를 만 드 는 과정 이 적당 하지 않 지만 원형 모델 은 이 문 제 를 잘 해결 할 수 있다.모든 사례 가 똑 같 기 때문이다.같은 인 스 턴 스 가 여러 개 필요 할 때 매번 new 연산 자 를 사용 하여 같은 인 스 턴 스 대상 을 만 들 필요 가 없습니다.이때 우 리 는 일반적인 생각 은 하나의 인 스 턴 스 대상 만 만 만 들 고 그 다음 에 더 많은 인 스 턴 스 가 필요 하 다 면 원래 의 이미지 복사 본 을 통 해 만 들 수 있 습 니 다.그러면 메모리 에 같은 인 스 턴 스 를 여러 개 만 들 필요 가 없습니다.메모리 의 소 모 를 줄 이 고 인 스 턴 스 의 재 활용 을 실현 합 니 다.그러나 이 사고방식 은 바로 원형 모델 의 실현 방식 이다.다음은 디자인 모델 중의 원형 디자인 모델 을 구체 적 으로 소개 한다.
2.원형 모델 에 대한 상세 한 소개
우 리 는 입 시 장면 의 실례 를 보 았 다.
기본 대상(일반적으로 인터페이스,추상 류):시험 문제(샘플)
원형 모델 의 복직 복제:필요 에 따라 시험 지 를 인쇄 하고 이곳 의 시험 지 는 모두 시험 문제 견본 을 복제 하 는 것 이다.
클 라 이언 트:학생 답안 지,같은 시험지,학생 이 문 제 를 똑 같이 풀 수 없습니다.
아 날로 그:
2016217153039715.png (784×574)
인터페이스:시험지 샘플 코드

  /// <summary>
  ///    
  /// </summary>
  public class SelectTest
  {
    private string other;
    public string      
    {
      get
      {
        return this.other;
      }
      set
      {
        this.other = value;
      }
    }
  }
  /// <summary>
  ///    
  /// </summary>
  public interface Itest
  {
    Itest Clone();

    string        
    {
      get;
      set;
    }
    string        
    {
      get;
      set;
    }
    string      
    {
      get;
      set;
    }
    SelectTest    
    {
      get;
      set;
    }

    Test Test
    {
      get;
      set;
    }

    Test Test1
    {
      get;
      set;
    }
  }
복제:복사기

 /// <summary>
  ///   Itest  
  /// </summary>
  public class Test : Itest
  {
    private string one;
    private string two;
    private string three;
    private SelectTest other=new SelectTest();
    public string        
    {
      get
      {
        return this.one;
      }
      set
      {
        this.one = value;
      }
    }
    public string        
    {
      get
      {
        return this.two;
      }
      set
      {
        this.two = value;
      }
    }
    public string      
    {
      get
      {
        return this.three;
      }
      set
      {
        this.three = value;
      }
    }
    public SelectTest    
    {
      get
      {
        return this.other;
      }
      set
      {
        this.other = value;
      }
    }
    #region IColorDemo   

    public Itest Clone()
    {
      //     
      return (Itest)this.MemberwiseClone();
    }
    #endregion
  }
클 라 이언 트

 static void Main()
    {
      //    
      Itest test = new Test();
      //      
      Itest test1 = test.Clone();
      
      //  1
      test.        = "23";
      test.   .      = "18";

      //  2
      test1.        = "24";
      test1.   .      = "20";

      //        
      Console.WriteLine("test       :" + test.       );  //23
      Console.WriteLine("test   .     :" + test.   .     );  //20
      Console.WriteLine("test1       :" + test1.       );  //24
      Console.WriteLine("test1   .     :" + test1.   .     ); //20

      Console.ReadKey();
    }
주의:여기 두 사람 이 서로 다 르 게 대답 하 는데 왜 부가 문제 에서 아내 의 나 이 는 모두 20 입 니까?
여 기 는 깊 은 복사,얕 은 복사 문제 와 관련 되 어 있 습 니 다.값 유형 은 스 택 에 놓 여 있 습 니 다.복사 한 후에 역 에서 다시 추가 합 니 다.class 는 인용 유형 에 속 합 니 다.복사 한 후에 스 택 에 지침 을 다시 분 배 했 지만 지침 은 같은 위치 에 있 는 자원 을 가 리 킵 니 다.얕 은 복사,값 형식 만 복사,깊 은 복사,인용 유형 도 복사 합 니 다.
해결 방안:

 public Itest Clone()
    {
      //     
      Itest itst= (Itest)this.MemberwiseClone();
      SelectTest st = new SelectTest();
      st.      = this.other.     ;
      itst.    = st;
      return itst;

    } 

직렬 화 해결 사용

/// <summary>
  ///    
  /// </summary>
  [Serializable] 
  public class SelectTest
  {
    private string other;
    public string      
    {
      get
      {
        return this.other;
      }
      set
      {
        this.other = value;
      }
    }
  }
  /// <summary>
  ///    
  /// </summary>
  public interface Itest
  {
    Itest Clone();

    string        
    {
      get;
      set;
    }
    string        
    {
      get;
      set;
    }
    string      
    {
      get;
      set;
    }
    SelectTest    
    {
      get;
      set;
    }
   
  }

  /// <summary>
  ///   Itest  
  /// </summary>

  public class Test : Itest
  {
    private string one;
    private string two;
    private string three;
    private SelectTest other=new SelectTest();
    public string        
    {
      get
      {
        return this.one;
      }
      set
      {
        this.one = value;
      }
    }
    public string        
    {
      get
      {
        return this.two;
      }
      set
      {
        this.two = value;
      }
    }
    public string      
    {
      get
      {
        return this.three;
      }
      set
      {
        this.three = value;
      }
    }
    public SelectTest    
    {
      get
      {
        return this.other;
      }
      set
      {
        this.other = value;
      }
    }

    
    public Itest Clone()
    {
      SerializableHelper SerializableHelper = new     .SerializableHelper();
      string target = SerializableHelper.Serializable(this);
      return SerializableHelper.Derializable<Itest>(target); 

    }

  }


 public class SerializableHelper
  {
    public string Serializable(object target)
    {
      using (MemoryStream stream = new MemoryStream())
      {
        new BinaryFormatter().Serialize(stream, target);

        return Convert.ToBase64String(stream.ToArray());
      }
    }

    public object Derializable(string target)
    {
      byte[] targetArray = Convert.FromBase64String(target);

      using (MemoryStream stream = new MemoryStream(targetArray))
      {
        return new BinaryFormatter().Deserialize(stream);
      }
    }

    public T Derializable<T>(string target)
    {
      return (T)Derializable(target);
    }
  }

이것 이 바로 원형 모델 에 대한 운용 이다.원형 모델 의 실현 코드 를 소개 한 후에 다음 에 원형 모델 의 유형 도 를 보고 유형 도 를 통 해 원형 모델 이 중 류 간 의 관 계 를 정리한다.구체 적 인 유형 도 는 다음 과 같다.
2016217153142427.png (758×262)
3.원형 모델 의 장단 점
원형 모델 의 장점 은 다음 과 같다.
프로 토 타 입 모드 는 고객 에 게 새로운 인 스 턴 스 를 만 드 는 복잡성 을 숨 겼 습 니 다.
원형 모델 은 동적 으로 증가 하거나 비교적 적은 제품 류 를 허용 한다.
원형 모델 은 사례 의 구축 구 조 를 간소화 하고 공장 방법 모델 은 제품 류 등급 구조 와 같은 등급 구 조 를 가 져 야 하 며 원형 모델 은 이렇게 할 필요 가 없다.
제품 류 는 제품 의 등급 구 조 를 미리 확정 할 필요 가 없다.왜냐하면 원형 모델 은 그 어떠한 등급 구조 에 도 적용 되 기 때문이다.
원형 모델 의 단점 은 다음 과 같다.
각 종 류 는 반드시 복제 방법 을 갖 추어 야 한다.
복제 방법 을 갖 추 려 면 클래스 의 기능 을 전반적 으로 고려 해 야 한다.이것 은 새로운 클래스 에 대해 어렵 지 않 지만 기 존의 클래스 에 대해 반드시 쉬 운 것 은 아니다.특히 직렬 화 를 지원 하지 않 는 간접 대상 을 인용 하거나 순환 구 조 를 포함 하 는 것 을 인용 할 때.
4..NET 에서 원형 모델 의 실현
.NET 에 서 는 ICloneable 인터페이스(이 인 터 페 이 스 는 원형 이 고 복제 방법 을 제공 하 며 상기 코드 에서 Monkey KingPrototype 추상 류)에서 Clone()방법 으로 원형 모델 을 쉽게 실현 할 수 있 습 니 다.만약 에 우리 가 사용자 정의 하 는 클래스 가 크 론 기능 을 가지 고 있다 면 먼저 클래스 계승 과 ICloneable 인 터 페 이 스 를 정의 하고 Clone 방법 을 실현 합 니 다..NET 에서 원형 모드 를 구현 한 클래스 는 다음 그림 과 같 습 니 다.(그림 에서 부분 만 캡 처 하고 Reflector 역 컴 파일 도구 로 볼 수 있 습 니 다)
2016217153206825.png (378×557)

좋은 웹페이지 즐겨찾기