함수식 프로그래밍 디자인 모델: 제2부분-공장 방법 모델
소개하다.
본 시리즈의 첫 부분에서 언급한 바와 같이 소프트웨어 공학(SE)의 디자인 모델은 이미 4인방(GoF)이 작성한 이라는 책에서 널리 보급되었다.
이 문서에서는 설계 모델을 다음과 같은 문제 해결을 위한 모델로 분류합니다.
Creational - 단일 또는 다중 객체를 인스턴스화하는 방법을 제공하는 모델입니다.
구조 모델 - 클래스와 대상 간의 관계를 정의하는 방법을 제공하는 모델이다.
비헤이비어 - 클래스와 객체 간의 통신 방식을 정의하는 모드입니다.
this excellent page by Vince Huston를 사용하면 서로 다른 패턴의 분류에 대해 더 많은 정보를 얻을 수 있습니다.
벤스의 주기표는 디자인 모델도를 계발했다.It's interactive too!
본고에서 우리는 일종의 창조적 모델인 공장 방법 모델을 이해할 것이다.
공장 방법 모델
팩토리 메소드 디자인 모드 설명은 작성할 정확한 제품 클래스를 지정하지 않고 Creator 클래스에 팩토리 메소드를 공개합니다.factory 방법은 Creator 클래스가 제품의 실례화를 하위 클래스로 미루도록 허용합니다.
아이고!다시 한 번 말하지만, 정말 한마디다.
지난번처럼 이 정의를 분해합시다.여기에는 몇 가지 핵심 구성 요소가 있습니다.
Creator - 제품을 반환하는 공장 접근 방식을 정의하는 인터페이스 또는 추상 클래스입니다.
Product - 구체적인 제품에 추상층 인용의 인터페이스나 추상류를 제공합니다.
공장 방법 - 구체적인 창조자가 실시하는 방법으로 되돌아갈 구체적인 제품을 지정하는 데 쓰인다.
소매점의 예
앞의 글의 정신에 따라 우리는 같은 소매점 예시를 사용하지만 서로 다른 문제 배경에서 사용한다.
만약 소매점에 대해 가정한다면, 우리는 우리의 업무를 더욱 잘 평가하기 위해 시뮬레이터를 도입하고 싶다.우리의 시뮬레이터에서 우리는 두 가지 다른'고객 모델'을 선택할 수 있다. 우리는 매우 나쁘고 까다로운 고객을 모의하거나 매우 좋고 친절한 고객을 모의할 수 있다.
우리는 아날로그 코드의 나머지 부분에 영향을 주지 않는 상황에서 서로 다른 고객을 만드는 방식을 구별하기를 바란다.다음과 같이 공장 접근 방식 모델을 구현할 수 있습니다.
interface CustomerCreator {
public Customer createCustomer();
}
interface Customer {
public boolean isGood();
}
class GoodCustomerCreator implements CustomerCreator {
public Customer createCustomer() {
return new GoodCustomer();
}
}
class BadCustomerCreator implements CustomerCreator {
public Customer createCustomer() {
return new BadCustomer();
}
}
class GoodCustomer implements Customer {
public boolean isGood() {
return true;
}
}
class BadCustomer implements Customer {
public boolean isGood() {
return false;
}
}
보시다시피 우리는 제품의 서로 다른 방식을 만들고 표시하는 논리적 결합을 쉽게 할 수 있습니다.다음과 같은 상황에서 이런 모델은 정말 이채를 띠게 될 것이다.
interface CustomerCreator {
public Customer createCustomer();
}
interface Customer {
public boolean isGood();
}
class GoodCustomerCreator implements CustomerCreator {
public Customer createCustomer() {
return new GoodCustomer();
}
}
class BadCustomerCreator implements CustomerCreator {
public Customer createCustomer() {
return new BadCustomer();
}
}
class GoodCustomer implements Customer {
public boolean isGood() {
return true;
}
}
class BadCustomer implements Customer {
public boolean isGood() {
return false;
}
}
제품을 만드는 방식이 갈수록 많아지고 있다.예를 들어, 우리 상점의 시뮬레이터에서, 우리는 현재 좋은 고객이나 나쁜 고객으로 무작위로 돌아가는 방식을 원한다.우리는 간단하게
RandomCustomerCreator
를 만들고 무작위 논리를 봉인할 수 있다.부모 프로세스는 Creator
클래스에 대한 인용을 유지하기만 하면 됩니다.점점 더 많은 제품들이 있습니다.이와 유사하게, 우리는 새로운 고객을 위해
Customer
인터페이스를 실현하고, 거기에서 어떠한 추가 논리를 실현하기만 하면 된다.기능적 방법
함수식 프로그래밍의 우호적인 방식으로 이루어진 전략 모델을 살펴보자.
카레
이런 모델에 대해 우리는'카레'라고 불리는 개념을 이용할 수 있다.Curry는 함수 프로그래밍과 수학에서 가장 흔히 볼 수 있는 개념으로 하나의 과정이다. 이 과정에서 여러 개의 매개 변수를 받아들이는 함수는 한 개의 매개 변수만 받아들이는 함수로 변환되고 더 많은 매개 변수를 받아들이는 다른 함수로 되돌아갈 수 있다.
또 하나의 지루한 정의!간단히 예를 들어 살펴보겠습니다.
세 개의 숫자를 더하는 함수를 구현합니다.
const addMyTriple = (a, b, c) => {
return a + b + c;
}
addMyTriple(1, 2, 3) // Returns 6.
이 함수를 사용하면 다음과 같은 결과가 발생합니다.
const addMyTriple = (a) => {
return (b) => {
return (c) => {
return a + b + c;
}
}
}
addMyTriple(1)(2)(3) // Returns 6.
이것은 보기에 하나의 예처럼 보인다. 우리는 단지 함수의 상세한 정도를 늘리고 있을 뿐이지, 그렇지 않니?그러나 관건은 우리가 매번 내부 함수로 되돌아오는 것을 의식하는 것이다.갑작스레, 이것은 매우 귀중하게 변했다. 왜냐하면 우리는currying을 사용하여 변수를 복원하고 다른 함수를 형성할 수 있기 때문이다.
여기에 예가 하나 있다.가령 우리가 이전처럼 세 개의 숫자를 추가하고 싶다고 가정하지만, 지금 우리는 첫 번째 숫자를always10
로 고정시키고 싶다.
우리는 이렇게 간단하게 새로운 함수를 조합할 수 있다.
const addMyDoublePlusTen = addMyTriple(10);
addMyDoublePlusTen(2,3) // Returns 15.
이제 공장 방법 모델의 실현에 적용합시다.
const customerCreator = (isGood) => {
return isGood ? goodCustomer : badCustomer;
}
const customer = (isGood) => {
return {
isGood: isGood
};
}
const goodCustomerCreator = () => {
return customerCreator(true);
}
const badCustomerCreator = () => {
return customerCreator(false);
}
const goodCustomer = () => {
return customer(true);
}
const badCustomer = () => {
return customer(false);
}
보시다시피, 우리는 커리를 이용하여 서로 다른 창설자 함수의 유형을 구분합니다.우리도 고객을 위해 이렇게 한다.
비록 이 예는 매우 직관적으로 보이지만 이 모델을 언제 사용하는지 이해하는 관건은 두 가지 관건적인 미세한 차이에 있다.
const addMyTriple = (a, b, c) => {
return a + b + c;
}
addMyTriple(1, 2, 3) // Returns 6.
const addMyTriple = (a) => {
return (b) => {
return (c) => {
return a + b + c;
}
}
}
addMyTriple(1)(2)(3) // Returns 6.
const addMyDoublePlusTen = addMyTriple(10);
addMyDoublePlusTen(2,3) // Returns 15.
const customerCreator = (isGood) => {
return isGood ? goodCustomer : badCustomer;
}
const customer = (isGood) => {
return {
isGood: isGood
};
}
const goodCustomerCreator = () => {
return customerCreator(true);
}
const badCustomerCreator = () => {
return customerCreator(false);
}
const goodCustomer = () => {
return customer(true);
}
const badCustomer = () => {
return customer(false);
}
당신은 어떻게 대상을 실례화하기를 원합니까?(순서, 구성, 구성 등)
어떻게 서로 다른 유형의 대상을 표시합니까?(데이터 패브릭 등)
확장 예
학습 과정을 촉진하기 위해 다음과 같은 몇 가지 문제와 이를 어떻게 실시할 것인지를 생각해 보세요.
다음
이 글은 함수식 프로그래밍 환경에서 디자인 모델을 활용한 시리즈의 두 번째 부분이다.더 많은 정보를 알고 싶으시면 계속해서 제 사이트를 주목해 주십시오.
Reference
이 문제에 관하여(함수식 프로그래밍 디자인 모델: 제2부분-공장 방법 모델), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/qgabe/functional-programming-design-patterns-part-2-factory-method-pattern-e19
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(함수식 프로그래밍 디자인 모델: 제2부분-공장 방법 모델), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/qgabe/functional-programming-design-patterns-part-2-factory-method-pattern-e19텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)