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):복잡 한 대상 을 분리 시 켜 같은 구축 과정 에서 서로 다른 표 시 를 만 들 수 있 도록 합 니 다.
건축 자 모델 은 건축 코드 와 표시 코드 의 분 리 를 통 해 클 라 이언 트 가 제품 내부 구성의 세부 사항 을 알 필요 가 없 게 하고 클 라 이언 트 와 구체 적 인 제품 간 의 결합 도 를 낮 출 수 있다.다음은 아 날로 그 를 통 해 건축 자 모델 의 유형 간 의 관 계 를 더욱 잘 정리 하도록 도와 준다.
건설 자 모델 에 대한 분석
건축 자 모델 의 구체 적 인 실현 을 소개 한 후에 우 리 는 건축 모델 의 실현 요점 을 정리 합 시다.
건설 자 모델 에서 지휘 자 는 클 라 이언 트 와 직접 접촉 했다.지휘 자 는 클 라 이언 트 가 제품 을 만 드 는 요 구 를 각 부품 에 대한 건설 요구 로 나 누고 이런 요 구 를 구체 적 인 건설 자 역할 에 위임 했다.구체 적 인 건설 자 역할 은 구체 적 인 제품 의 구축 업 무 를 완성 하 는 것 이지 만 고객 에 게 알려 지지 않 았 다.
건설 자 모델 은 주로'단계별 로 복잡 한 대상 을 구축 하 는 데 사용 된다'.그 중에서'단계별'는 고정된 조합 과정 이 고 복잡 한 대상 의 각 부분 은 자주 변화 한다(즉,컴퓨터 의 내부 구성 요 소 는 자주 변화 한다.여기 서 말 하 는 변 화 는 하 드 디스크 의 크기 가 변 하고 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)은 복잡 한 대상 의 구축 과 그 표현 을 분리 시 켜 똑 같은 구축 과정 에서 서로 다른 표 시 를 만 들 수 있 습 니 다.건설 자 모델 의 본질은 조립 과정(지휘자 류 로 포장 하여 결합 을 해제 하 는 목적 을 달성 하 는 것)과 구체 적 인 제품 의 결합 을 만 드 는 것 이다.우 리 는 모든 구성 요소 가 어떻게 조립 하 는 지 에 관심 을 가지 지 않 아 도 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.