C\#디자인 모델 프로 그래 밍 에서 건축 자 모델 에 대한 활용 을 깊이 분석 합 니 다.

12885 단어 C#디자인 모드
예시
우 리 는 먼저 이런 장면 으로 도입 한다. 
컴퓨터 타 운 에서 기 계 를 설치 하 는 데 는 항상 이런 경험 이 있다.우리 가 가게 에 도착 하면 먼저 한 판매원 이 와 서 당신 이 설치 하고 싶 은 기계 가 어떤 배치 인지 물 을 것 입 니 다.그 는 당신 에 게 조언 을 해 줄 것 입 니 다.결국 조립 명세 서 를 형성 할 것 입 니 다.고객 과 설비 배 치 를 확정 한 후에 그 는 이 단 어 를 출하 하 는 사람 에 게 건 네 주 고 그 가 이 부품 들 을 준비 하여 준비 가 끝 난 후에 설비 기술자 에 게 건 네 줄 것 이다.기술 자 는 이 부품 들 을 하나의 기계 로 조립 하여 고객 에 게 건 네 줄 것 이다.
어떤 컴퓨터 든 CPU,메모리,메인보드,하 드 디스크 와 그래 픽 카드 등 부품 으로 구성 되 고 장 착 과정 은 항상 고정 되 어 있 습 니 다.
메인보드 를 기계 상자 에 고정시키다.
CPU 를 메인보드 에 설치 하 다.
메모 리 를 메인보드 에 설치 하 다.
하드디스크 를 메인보드 에 연결 하 다.
4.567917.그래 픽 카드 를 메인보드 에 설치 합 니 다.4.567918.
그러나 모든 호환기 의 부품 은 각각 다 르 고,어떤 것 은 높 게 설정 되 어 있 으 며,어떤 것 은 낮 게 설정 되 어 있 으 며,이것 은 변화 점 이다.설비 기술자 에 게 있어 서 그 는 이 부품 들 이 어디에서 왔 는 지 고려 할 필요 가 없다.그 는 그들 을 한데 조립 해 야 한다.이것 은 안정 적 인 설비 절차 이다.이러한 변 화 된 부품 과 안정 적 인 절 차 를 분리 하려 면 Builder 모드 를 도입 해 야 한다.
예제 코드

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;

 

namespace BuilderExemple

{

  classProgram

  {

    staticvoid Main(string[] args)

    {

      ComputerFactory factory = newComputerFactory();

      ComputerBuilder office = newOfficeComputerBuilder();

      factory.BuildComputer(office);

      office.Computer.ShowSystemInfo();

      ComputerBuilder game = newGameComputerBuilder();

      factory.BuildComputer(game);

      game.Computer.ShowSystemInfo();

    }

  }

 

  classComputerFactory

  {

    publicvoid BuildComputer(ComputerBuilder cb)

    {

      Console.WriteLine();

      Console.WriteLine(">>>>>>>>>>>>>>>>>>Start Building " + cb.Name);

      cb.SetupMainboard();

      cb.SetupCpu();

      cb.SetupMemory();

      cb.SetupHarddisk();

      cb.SetupVideocard();

      Console.WriteLine(">>>>>>>>>>>>>>>>>>Build " + cb.Name + " Completed");

      Console.WriteLine();

    }

  }

 

  abstractclassComputerBuilder

  {

    protectedstring name;

 

    publicstring Name

    {

      get { return name; }

      set { name = value; }

    }

 

    protectedComputer computer;

 

    publicComputer Computer

    {

      get { return computer; }

      set { computer = value; }

    }

 

    public ComputerBuilder()

    {

      computer = newComputer();

    }

 

    publicabstractvoid SetupMainboard();

    publicabstractvoid SetupCpu();

    publicabstractvoid SetupMemory();

    publicabstractvoid SetupHarddisk();

    publicabstractvoid SetupVideocard();

  }

 

  classOfficeComputerBuilder : ComputerBuilder

  {

    public OfficeComputerBuilder()

    {

      name = "OfficeComputer";

    }

 

    publicoverridevoid SetupMainboard()

    {

      computer.Mainboard = "Abit  LG-95C   (Intel 945GC   /LGA 775/1066MHz) ";

    }

 

    publicoverridevoid SetupCpu()

    {

      computer.Cpu = "Intel      D 336 (2.8GHz/LGA 775/256K/533MHz) ";

    }

 

    publicoverridevoid SetupMemory()

    {

      computer.Memory = "Patriot  DDR2 667 512MB      ";

    }

 

    publicoverridevoid SetupHarddisk()

    {

      computer.Harddisk = "Hitachi  SATAII       (80G/7200 /8M)  ";

    }

 

    publicoverridevoid SetupVideocard()

    {

      computer.Videocard = "    ";

    }

  }

 

  classGameComputerBuilder : ComputerBuilder

  {

    public GameComputerBuilder()

    {

      name = "GameComputer";

    }

 

    publicoverridevoid SetupMainboard()

    {

      computer.Mainboard = "GIGABYTE  GA-965P-DS3 3.3   (INTEL P965    )" ;

    }

 

    publicoverridevoid SetupCpu()

    {

      computer.Cpu = "Intel      E4400 (2.0GHz/LGA 775/2M/800MHz)  ";

    }

 

    publicoverridevoid SetupMemory()

    {

      computer.Memory = "G.SKILL   F2-6400CL5D-2GBNQ DDR2 800 1G*2     ";

    }

 

    publicoverridevoid SetupHarddisk()

    {

      computer.Harddisk = "Hitachi  SATAII       (250G/7200 /8M)  ";

    }

 

    publicoverridevoid SetupVideocard()

    {

      computer.Videocard = "     GT-GD3 UP    H10   (GeForce 8600GT/256M/DDR3)  HDMI!";

    }

  }

 

  classComputer

  {

    privatestring videocard;

 

    publicstring Videocard

    {

      get { return videocard; }

      set { videocard = value; }

    }

 

    privatestring cpu;

 

    publicstring Cpu

    {

      get { return cpu; }

      set { cpu = value; }

    }

 

    privatestring mainboard;

 

    publicstring Mainboard

    {

      get { return mainboard; }

      set { mainboard = value; }

    }

 

    privatestring memory;

 

    publicstring Memory

    {

      get { return memory; }

      set { memory = value; }

    }

 

    privatestring harddisk;

 

    publicstring Harddisk

    {

      get { return harddisk; }

      set { harddisk = value; }

    }

 

    publicvoid ShowSystemInfo()

    {

      Console.WriteLine("==================SystemInfo==================");

      Console.WriteLine("CPU:" + cpu);

      Console.WriteLine("MainBoard:" + mainboard);

      Console.WriteLine("Memory:" + memory);

      Console.WriteLine("VideoCard:" + videocard);

      Console.WriteLine("HardDisk:" + harddisk);

    }

  }

}

코드 설명: 
Computer Factory 는 건설 자 모델 의 지도자 이다.지도 자 는 안정 적 인 건설 작업 을 한다.만약 에 그것 이 기술자 라 고 가정 하면 그 는 고정된 절차 에 따라 부품 을 컴퓨터 로 조립 하 는 중복 노동 을 하고 있 을 뿐이다.그 는 그 가 현재 조립 하고 있 는 것 이 게임 컴퓨터 인지 사무 용 컴퓨터 인지,그 가 메인보드 에 설치 한 메모리 가 1G 인지 2G 인지 모른다.허허,부적 합 한 기술자 로 군.
Computer Builder 는 추상 적 인 건축 자 역할 이다.그것 은 주로 두 가지 인 터 페 이 스 를 정의 하 는 데 사용 되 며,하나의 인 터 페 이 스 는 제품 의 각 부분의 구성 을 규범화 하 는 데 사용 된다.예 를 들 어 컴퓨터 한 대 를 조립 하 는 데 필요 한 5 개의 공정 을 규정 했다.두 번 째 인 터 페 이 스 는 건 설 된 제품 을 되 돌려 주 는 데 사용 되 는데 여기 서 우 리 는 추상 적 인 방법 을 정의 하지 않 았 다.어차피 만들어 진 것 은 항상 컴퓨터 이다.
Office Computer Builder 와 GameComputer Builder 는 구체 적 인 건설 자 입 니 다.그의 일 은 각 건설 절차 의 인 터 페 이 스 를 실현 하고 제품 으로 돌아 가 는 인 터 페 이 스 를 실현 하 는 것 이다.여기 서 후 자 는 생략 했다.
컴퓨터 는 만들어 진 복잡 한 제품 이다.코드 에서 우리 의 각종 건설 절 차 는 모두 제품 중의 각종 부품 서 비 스 를 만 들 기 위 한 것 이다.Computer 는 상대 적 으로 구체 적 인 제품 을 정의 했다.응용 에서 이 제품 을 비교적 높 은 추상 화 를 해서 서로 다른 구체 적 인 건축 자 는 심지어 완전히 다른 제품 을 만 들 수 있다.
클 라 이언 트 의 코드 를 보면 사용 자 는 먼저 구체 적 인 Builder 를 선택 했다.사용 자 는 게임 컴퓨터 가 필요 한 지 사무 용 컴퓨터 가 필요 한 지 명확 해 야 하지만 컴퓨터 에 대해 아무것도 모 르 고 영업 사원 이 합 리 적 인 설정 서 를 제시 할 수 있다.그리고 사용 자 는 컴퓨터 팩 토리 에 이 컴퓨터 를 조립 하 라 고 했다.조립 이 끝 난 후 Computer Factory 가 켜 져 서 사용자 에 게 컴퓨터 의 설정 이 정확 한 지 확인 해 줍 니 다.
Computer Builder 와 추상 적 인 공장 모델 의 추상 적 인 공장 역할 차이 가 많 지 않 고 GameComputer Builder 는 구체 적 인 공장 같다 고 생각 할 지도 모른다.사실은 건축 자 모델 과 추상 적 인 공장 모델 의 중심 이 다르다.전 자 는 하나의 조립 개념 을 강조 하고 복잡 한 대상 은 여러 개의 부품 으로 조립 되 고 조립 은 일정한 기준 에 따라 진행 되 며 후 자 는 일련의 제품 을 만 드 는 것 을 강조 한다.건설 자 모델 은 컴퓨터 한 대 를 조립 하 는 데 적용 되 고 추상 적 인 공장 모델 은 사용자 의 노트북,데스크 톱 컴퓨터 와 핸드 컴퓨터 를 제공 하 는 제품 시리즈 에 적용 된다.
건설 자 모드 의 정의 와 도표
건축 자 모델 의 구체 적 인 실현 을 소개 한 후에 건축 자 모델 의 구체 적 인 정의 가 어떤 지 구체 적 으로 살 펴 보 겠 습 니 다.
건설 자 모드(Builder Pattern):복잡 한 대상 을 분리 시 켜 같은 구축 과정 에서 서로 다른 표 시 를 만 들 수 있 도록 합 니 다.
건축 자 모델 은 건축 코드 와 표시 코드 의 분 리 를 통 해 클 라 이언 트 가 제품 내부 구성의 세부 사항 을 알 필요 가 없 게 하고 클 라 이언 트 와 구체 적 인 제품 간 의 결합 도 를 낮 출 수 있다.다음은 아 날로 그 를 통 해 건축 자 모델 의 유형 간 의 관 계 를 더욱 잘 정리 하도록 도와 준다.
2016217151228462.png (761×411)
건설 자 모델 에 대한 분석
건축 자 모델 의 구체 적 인 실현 을 소개 한 후에 우 리 는 건축 모델 의 실현 요점 을 정리 합 시다.
건설 자 모델 에서 지휘 자 는 클 라 이언 트 와 직접 접촉 했다.지휘 자 는 클 라 이언 트 가 제품 을 만 드 는 요 구 를 각 부품 에 대한 건설 요구 로 나 누고 이런 요 구 를 구체 적 인 건설 자 역할 에 위임 했다.구체 적 인 건설 자 역할 은 구체 적 인 제품 의 구축 업 무 를 완성 하 는 것 이지 만 고객 에 게 알려 지지 않 았 다.
건설 자 모델 은 주로'단계별 로 복잡 한 대상 을 구축 하 는 데 사용 된다'.그 중에서'단계별'는 고정된 조합 과정 이 고 복잡 한 대상 의 각 부분 은 자주 변화 한다(즉,컴퓨터 의 내부 구성 요 소 는 자주 변화 한다.여기 서 말 하 는 변 화 는 하 드 디스크 의 크기 가 변 하고 CPU 는 단 핵 에서 쌍 핵 으로 변 하 는 등).
제품 은 추상 류 를 필요 로 하지 않 는 다.건축 모델 이 만들어 진 최종 제품 은 차이 가 매우 클 수 있 기 때문에 추상 적 인 제품 류 를 추출 할 수 없다.
앞에서 소개 한 추상 적 인 공장 모델 은'시리즈 제품'의 수요 변 화 를 해 결 했 고 건설 자 모델 은'제품 부분'의 수요 변 화 를 해결 했다.
건설 자 는 구체 적 인 제품 의 조립 과정 을 숨 겼 기 때문에 한 제품 의 내 부 를 바 꾸 려 면 구체 적 인 건설 자 만 더 실현 하면 된다 고 밝 혀 제품 구성 요소 의 수요 변화 에 잘 대응 할 수 있다.
.NET 에서 건설 자 모델 의 실현
앞의 디자인 모델 은.NET 라 이브 러 리 에서 모두 해당 하 는 실현 이 있 습 니 다.그러면.NET 라 이브 러 리 에서 도 건설 자 모델 의 실현 이 존재 합 니까?그러나 의문 에 대한 답 은 긍정 적 이다..NET 라 이브 러 리 에서 System.Text.string Builder(mscorlib.dll 프로그램 집중 존재)는 건설 자 모델 의 실현 이다.그러나 그의 실현 은 건축 자 모델 의 진화 에 속한다.이때 의 건축 자 모델 은 지휘자 역할 과 추상 적 인 건축 자 역할 이 없다.StringBuilder 류 는 구체 적 인 건축 자의 역할 을 하 는 동시에 지휘자 와 추상 적 인 건축 자의 역할 도 한다.이때 건축 모델 의 실현 은 다음 과 같다.

/// <summary>
  ///         
  ///                 
  ///                        
  /// </summary>
  public class Builder
  {
    //           
    private Product product = new Product();
    public void BuildPartA()
    {
      product.Add("PartA");
    }
    public void BuildPartB()
    {
      product.Add("PartB");
    }
    public Product GetProduct()
    {
      return product;
    }
    //         
    public void Construct()
    {
      BuildPartA();
      BuildPartB();
    }
  }
  /// <summary>
  ///    
  /// </summary>
  public class Product
  {
    //       
    private IList<string> parts = new List<string>();
    //                
    public void Add(string part)
    {
      parts.Add(part);
    }
    public void Show()
    {
      Console.WriteLine("       .......");
      foreach (string part in parts)
      {
        Console.WriteLine("  " + part + "   ");
      }
      Console.WriteLine("      ");
    }
  }
  //             
  class Client
  {
    private static Builder builder;
    static void Main(string[] args)
    {
      builder = new Builder();
      builder.Construct();
      Product product = builder.GetProduct();
      product.Show();
      Console.Read();
    }
  }
StringBuilder 클래스 는 string 대상 을 만 드 는 구체 적 인 작성 자 역할 을 합 니 다.그 중에서 ToString()방법 은 구체 적 인 제품 을 클 라 이언 트 에 게 되 돌려 주 는 데 사 용 됩 니 다(상기 코드 에서 GetProduct 방법 에 해당 합 니 다).그 중에서 Append 방법 은 제품 의 구성 요 소 를 만 드 는 데 사 용 됩 니 다(위 코드 에서 BuildPartA 와 BuildPartB 방법 에 해당 합 니 다).string 대상 의 모든 구성 요 소 는 문자 이기 때문에 지휘자 역할 의 코드 가 필요 하지 않 습 니 다(Construct 방법 을 말 합 니 다.모든 구성 요 소 를 만 드 는 방법 으로 전체 제품 의 조립 을 완성 합 니 다).string 문자열 대상 의 모든 구성 요소 가 똑 같 고 문자 이기 때문에 Append 방법 도 지휘자 Construct 방법의 역할 을 합 니 다.
총결산
여기까지 건설 자 모델 에 대한 소 개 는 끝 났 습 니 다.건설 자 모델(Builder Pattern)은 복잡 한 대상 의 구축 과 그 표현 을 분리 시 켜 똑 같은 구축 과정 에서 서로 다른 표 시 를 만 들 수 있 습 니 다.건설 자 모델 의 본질은 조립 과정(지휘자 류 로 포장 하여 결합 을 해제 하 는 목적 을 달성 하 는 것)과 구체 적 인 제품 의 결합 을 만 드 는 것 이다.우 리 는 모든 구성 요소 가 어떻게 조립 하 는 지 에 관심 을 가지 지 않 아 도 된다.

좋은 웹페이지 즐겨찾기