공장 모드 - 전면 설계 모드
12811 단어 webdevtypescriptjavascriptangular
물론 빠른 승리였다.얼마 후 대리판매상은 오토바이를 판매하기 시작하기로 결정했다.
🤦 아, 아니오, 더 많은 코드가 중복됩니까?만약 주문 시스템을 변경해야 한다면, 우리는 지금 세 곳에서 업데이트를 진행해야 합니까!!?
우리는 모두 가 본 적이 있다.이런 상황이 언제 일어날지 예측하기 어렵다.그러나 이렇게 할 때 해결 방안이 처음에는 재구성이 필요할 수도 있지만, 더욱 쉽게 유지보수할 수 있는 해결 방안이 있다는 것을 알아야 한다. 특히 대리판매상이 선박을 판매하기 시작할 때!🛥️
이 문서에서는 다음과 같은 내용을 다룹니다.
💪 하나의 솔루션 - 공장 모델
공장 모델은 일종의 창조적인 디자인 모델로 통용되는 유형의 여러 대상 간의 공공 기본 행위에 추상층을 추가했다.
클라이언트 코드는 이 층의 코드를 곧 사용할 것이니 행위 실현의 세부 사항을 알 필요가 없다. 그것이 존재하기만 하면.
만약 우리가 우리의 자동차 대리판매상이 다차 대리판매상으로 바뀐 것을 예로 들면, 우리는 자동차, 트럭, 선박 간의 공통점이 모두 차량이라는 것을 볼 수 있다.대리판매상 내의 주문 시스템은 기본 차량과 함께 사용하기만 하면 되고 처리 중인 차량의 구체적인 정보를 알 필요가 없다.
이 점을 설명하기 위해 UML 그림을 빠르게 살펴보겠습니다.
그림에서 알 수 있듯이 시스템은
Vehicle
인터페이스의 구체적인 실현을 포함한다.OrderSystem
이러한 구체적인 실현이 무엇인지 모르거나 알아야 한다. 그것은 VehicleFactory
에 의존하여 필요할 때 만들어서 되돌려주기 때문에 우리의 OrderSystem
를 대리판매상이 판매하고자 하는 Vehicles
와 분리한다!🚀🚀🚀그들은 현재 임의의 차량으로 확장할 수 있습니다. 우리는
Vehicle
인터페이스의 새로운 실현을 만들고 VehicleFactory
를 업데이트해서 그것을 만들 수 있습니다.🔥🔥🔥🤔 언제 써야 합니까?
이러한 모드는 위에서 설명한 경우를 제외하고 다음과 같은 경우에 적합합니다.
🤯 약간의 장점과 단점
이점:
❓ 그것은 전방 세계에서 어디에서 응용됩니까?
놀랍게도 Angular는 모듈 공급자 중에서 공장을 사용할 수 있도록 허락했다.개발자는 공장을 이용하여 모듈에 의존 관계를 제공할 수 있으며 프로그램이 실행될 때까지 필요한 정보를 제공할 때 공장이 매우 유용하다.
Angular Docs forFactory Providers에서 자세한 내용을 확인할 수 있습니다.
🏭 예를 하나 봅시다!
프런트엔드의 좋은 예는 플랫폼 간 UI입니다.
대화상자를 표시하는 크로스플랫폼 프로그램이 있다고 상상해 보세요.프로그램 자체가 대화상자를 렌더링하고 숨길 수 있도록 허용해야 합니다.이 대화상자는 모바일 프로그램에서 데스크톱과 다르게 나타날 수 있습니다.그러나 기능은 같아야 한다.응용 프로그램은 공장에서 실행할 때 정확한 대화상자를 만들 수 있습니다.
이 예에서는 TypeScript를 사용하여 a
Dialog
, aMobileDialog
와 aDesktopDialog
의 두 가지 구현을 만들 것입니다.응용 프로그램은 사용자 프록시 문자열을 사용하여 데스크톱이나 모바일 장치에서 응용 프로그램을 볼 수 있는지 확인하고, 공장을 사용하여 정확한 대화상자를 만들 것입니다.참고: 일반적으로 응답 대화 상자를 개발하는 것이 더 이상적이지만 Factory 모드를 보여 주는 예입니다.
먼저 기본 대화상자 인터페이스를 만듭니다
interface Dialog {
template: string;
title: string;
message: string;
visible: boolean;
hide(): void;
render(title: string, message: string): string;
}
이 인터페이스는 어떤 구체적인 실현도 따를 수 있는 흔한 행위와 상태를 정의한다.다음과 같은 구체적인 실현을 만듭니다.
class MobileDialog implements Dialog {
title: string;
message: string;
visible = false;
template = `
<div class="mobile-dialog">
<h2>${this.title};</h2>
<p class="dialog-content">
${this.message}
</p>
</div>
`;
hide() {
this.visible = false;
}
render(title: string, message: string) {
this.title = title;
this.message = message;
this.visible = true;
return this.template;
}
}
class DesktopDialog implements Dialog {
title: string;
message: string;
visible = false;
template = `
<div class="desktop-dialog">
<h1>${this.title};</h1>
<hr>
<p class="dialog-content">
${this.message}
</p>
</div>
`;
hide() {
this.visible = false;
}
render(title: string, message: string) {
this.title = title;
this.message = message;
this.visible = true;
return this.template;
}
}
이 기능은 약간의 미세한 변화만 있을 뿐입니다. 추상류가 이런 상황에 더 적합하다고 생각할 수 있습니다. 왜냐하면 render
와 hide
방법은 같기 때문입니다.이 예에서 우리는 이 인터페이스를 계속 사용할 것이다.이제 우리는 우리의 공장을 창설해야 한다.
class DialogFactory {
createDialog(type: 'mobile' | 'desktop'): Dialog {
if (type === 'mobile') {
return new MobileDialog();
} else {
return new DesktopDialog();
}
}
}
우리 공장은 type
를 채택한 후에 창립Dialog
의 정확한 실현을 실현할 것이다.마지막으로, 우리의 응용 프로그램은 우리의 공장을 소모해야 한다.
class App {
dialog: Dialog;
factory = new DialogFactory();
render() {
this.dialog = this.factory.createDialog(isMobile() ? 'mobile' : 'desktop');
if (this.dialog.visible) {
this.dialog.render('Hello World', 'Message here');
}
}
}
위의 코드를 보면 응용 프로그램이 구체적인 실현을 알 필요가 없다는 것을 알 수 있다. 반면에 논리는 DialogFactory
의 책임이다.이 코드 예제가 Factory 모드와 프런트엔드 세계에서의 잠재적 용도를 설명하는 데 도움이 되었으면 합니다.
개인적으로 저는 이런 모델의 개념과 장점을 이해하지만 그 실현에 필요한 계승에 대한 관심과 의존을 좋아하지 않습니다.
이 모델의 어떤 다른 예나 당신 자신의 관점을 마음대로 토론해 주십시오. 왜냐하면 나는 아직 결정하지 않았기 때문입니다.
질문이 있으시면 언제든지 아래 질문이나 트위터에 연락 주세요.
Reference
이 문제에 관하여(공장 모드 - 전면 설계 모드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/coly010/the-factory-pattern-design-patterns-meet-the-frontend-1p2l텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)