디자인 모델 - 단순 공장 모델 (C 언어 사례)
6766 단어 대상 지향 프로 그래 밍디자인 모드
일 모드 동기
먼저 이런 수 요 를 살 펴 보 겠 습 니 다. 이날 당신 의 첫째 가 당신 에 게 말 했 습 니 다. "샤 오리, 회사 의 재료 가 부족 합 니 다. 당신 은 가 립 창 상점 에 가서 0805 커 패 시 터 를 사 온 다음 에 제 다 방 에 가서 0603 커 패 시 터 를 사 오 세 요.""네." 그래서 당신 은 작업장 으로 돌아 가 일 을 시작 할 준 비 를 하 세 요.
이 장면 이 프로그램 으로 이 루어 진다 면 어떻게 써 야 할 지 생각해 보 세 요.C 언어의 전통 적 인 과정 을 보면 이렇게 써 야 한다.
#include
void login_website(char *str);
void enter_jlc();
void bug_jlc_capacity(char *str);
void enter_jdb();
void bug_jdb_capacity(char *str);
int main()
{
/* */
login_website("www.taobao.com");
/* */
enter_jlc();
/* 0805 */
bug_jlc_capacity("0805");
/* */
enter_jdb();
/* 0805 */
bug_jdb_capacity("0603");
return 0;
}
void login_website(char *str)
{
printf(" :%s!
",str);
}
void enter_jlc()
{
printf("
");
}
void bug_jlc_capacity(char *str)
{
printf(" :%s
",str);
}
void enter_jdb()
{
printf("
");
}
void bug_jdb_capacity(char *str)
{
printf(" :%s
",str);
}
코드 는 초보 C 온라인 도구 실행 중 실행 결 과 를 볼 수 있 도록 직접 복사 할 수 있 습 니 다.결 과 는 다음 과 같다.
로그 인 을 환영 합 니 다: www. taobao. com!가 립 창 플래그 십 스토어 에 들 어가 가 립 창 커 패 시 터 구 매: 0805 제 다 방 플래그 십 스토어 에 들 어가 제 다 방 커 패 시 터 구 매: 0603
모두 웃 지 마 세 요. 확실히 모든 내장 형 소프트웨어 엔지니어 가 막 입문 할 때 이런 코드 를 씁 니 다.프로그램 기능 을 보면 맏형 의 요 구 를 충족 시 키 고 가게 마다 다른 재 료 를 사 왔 다.
하지만 만약 boss 가 내일 당신 에 게 먼저 제 다 방 에 가서 가 립 창 에 가라 고 한다 면 생각해 본 적 이 있 습 니까?아니면 다른 상점 에 가서 다른 재 료 를 더 사 오 라 고 할 까?
매번 다른 상점 에 들 어 갈 때마다 함 수 를 새로 추가 해서 실현 해 야 합 니까?각 상점 에서 재 료 를 구 매 할 때 도 함 수 를 새로 추가 하여 실현 해 야 합 니까?이렇게 하 는 데 얼마 걸 리 지 않 아, 너 는 곧 너의 절차 에 의 해 곤경 에 빠 질 것 이다.
해결 방안
문 제 를 어떻게 해결 합 니까?먼저 boss 의 수 요 를 자세히 살 펴 보 자. 이 안에 두 가지 행 위 는 중복 되 는데 그것 이 바로 쇼핑 몰 에 들 어가 고 쇼핑 하 는 것 이다. 그러면 우 리 는 이 를 추상 적 인 인터페이스 로 추출 해 야 한다.추상 류 는 일반적으로 대상 언어 를 대상 으로 하 는 명칭 으로 C 언어 에서 클래스 는 일반적으로 구조 체 로 대체 할 수 있 고 인 터 페 이 스 는 일반적으로 함수 포인터 로 대체 할 수 있다.추상 류 인 터 페 이 스 는 함수 포인터 만 있 는 구조 체 로 이해 할 수 있다.
그래서 여기 서 그것 을 추상 적 으로 다음 과 같다.
typedef struct shop_interface
{
void (*enter)();/* */
void (*buy)(const char *str);/* */
}SHOP_INSTERFACE,*pSHOP_INSTERFACE;
가 립 창 과 제 다 방 역시 하나의 상점 으로서 진입 과 구 매 등 기본 적 인 기능 이 있어 야 한다.그래서 두 사람 에 게 이 인터페이스 류 를 물 려 받 게 하 는 것 은 당연 하 다.
/* */
struct jlc
{
SHOP_INSTERFACE jlc_interface;
/* */
}
/* */
struct jdb
{
SHOP_INSTERFACE jdb_interface;
/* */
}
우리 가 바 라 는 것 은 메 인 프로그램 이 고객 처럼고객 은 상점 이 어떤 서 비 스 를 제공 할 수 있 는 지 에 만 관심 을 가지 고 서비스 가 어떻게 실현 되 는 지 에 관심 이 없다.마찬가지 로 우 리 는 메 인 프로그램 이 너무 많은 업무 세부 사항 에 영향 을 받 는 것 을 원 하지 않 고 메 인 프로그램 은 업무 논리 에 전념 해 야 한다.
메 인 프로그램 이 관심 을 가 지 는 것 은 업무 논리 와 밀접 한 관 계 를 가 진 인터페이스 (추상 적 인 인터페이스) 이다. 이런 인 터 페 이 스 는 반드시 업무 와 디 테 일 로 분 리 된 것 이다. 그러면 인 터 페 이 스 를 업무 와 디 테 일 로 분리 시 키 면?아래 factory () 함 수 를 보 세 요.
pSHOP_INSTERFACE factory(const char *str)
{
if("jlc" == str)
{
struct jlc *jlc_shop = (struct jlc*)malloc(sizeof(struct jlc));
/* */
((pSHOP_INSTERFACE)jlc_shop)->enter = enter_jlc;
((pSHOP_INSTERFACE)jlc_shop)->buy = bug_jlc_capacity;
return (pSHOP_INSTERFACE)jlc_shop;
}
else if("jdb" == str)
{
struct jdb *jdb_shop = (struct jdb*)malloc(sizeof(struct jdb));
/* */
((SHOP_INSTERFACE*)jdb_shop)->enter = enter_jdb;
((SHOP_INSTERFACE*)jdb_shop)->buy = bug_jdb_capacity;
return (pSHOP_INSTERFACE)jdb_shop;
}
}
추상 류 인터페이스의 실례 화 는 모두 factory () 함수 에서 이 루어 진 것 을 볼 수 있다.주 프로그램 은 지정 한 인 자 를 설정 하면 이 factory () 함 수 를 통 해 자신 이 진정 으로 원 하 는 인 터 페 이 스 를 얻 을 수 있 습 니 다.
개조 후의 주요 절 차 를 다시 보다.
int main(void) {
pSHOP_INSTERFACE shop;
/* */
login_website("www.taobao.com");
shop = factory("jlc");
/* */
shop->enter();
/* 0805 */
shop->buy("0805");
shop = factory("jdb");
/* */
shop->enter();
/* 0805 */
shop->buy("0603");
return 0;
}
이 프로그램의 실행 결과:
로그 인 을 환영 합 니 다: www. taobao. com!가 립 창 플래그 십 스토어 에 들 어가 가 립 창 커 패 시 터 구 매: 0805 제 다 방 플래그 십 스토어 에 들 어가 제 다 방 커 패 시 터 구 매: 0603
메 인 프로그램의 기능 은 변 하지 않 지만 세부 사항 을 실현 하지 않 고 업무 논리 에 전념 합 니 다.업무 와 세부 사항 은 서로 영향 을 주지 않 고 프로그램의 유지 가능성 과 확장 성 을 향상 시 켰 다.
단순 공장 모델 이 C 언어 에서 이 뤄 진 사례 다.비록 업무 와 세부 적 인 분 리 를 실현 하지만 아직도 뚜렷 한 결함 이 있다. 그것 은 공장 함수 factory () 에 if / else, switch / case 등 판단 문 이 나타 날 수 밖 에 없다 는 것 이다. 그래서 새로운 상점 에 가입 할 때마다 이 함 수 를 수정 하고 개방 - 폐쇄 원칙 을 위반 해 야 한다.(개방 폐쇄 원칙 은 모듈 이 확장 기능 을 받 아들 이 는 코드 를 말 하 며 모듈 은 소스 코드 를 수정 해 서 는 안 된다).
이 문 제 는 다음 장의 공장 방법 모델 로 남 겨 두 어 해결 해 야 한다.
개선 판 코드 원본 은 다음 과 같 습 니 다. 초보 C 온라인 도구 실행 중 실행 결 과 를 직접 복사 하여 볼 수 있 습 니 다.
#include
#include
#include
/* */
typedef struct shop_interface
{
void (*enter)();/* */
void (*buy)(const char *str);/* */
}SHOP_INSTERFACE,*pSHOP_INSTERFACE;
/* */
struct jlc
{
SHOP_INSTERFACE jlc_interface;
/* */
};
/* */
struct jdb
{
SHOP_INSTERFACE jdb_interface;
/* */
};
void login_website(const char *str);
void enter_jlc();
void bug_jlc_capacity(const char *str);
void enter_jdb();
void bug_jdb_capacity(const char *str);
pSHOP_INSTERFACE factory(const char *str);
int main(void) {
pSHOP_INSTERFACE shop;
/* */
login_website("www.taobao.com");
shop = factory("jlc");
shop->enter();
shop->buy("0805");
shop = factory("jdb");
shop->enter();
shop->buy("0603");
return 0;
}
void login_website(const char *str)
{
printf(" :%s!
",str);
}
void enter_jlc()
{
printf("
");
}
void bug_jlc_capacity(const char *str)
{
printf(" :%s
",str);
}
void enter_jdb()
{
printf("
");
}
void bug_jdb_capacity(const char *str)
{
printf(" :%s
",str);
}
pSHOP_INSTERFACE factory(const char *str)
{
if("jlc" == str)
{
struct jlc *jlc_shop = (struct jlc*)malloc(sizeof(struct jlc));
/* */
((pSHOP_INSTERFACE)jlc_shop)->enter = enter_jlc;
((pSHOP_INSTERFACE)jlc_shop)->buy = bug_jlc_capacity;
return (pSHOP_INSTERFACE)jlc_shop;
}
else if("jdb" == str)
{
struct jdb *jdb_shop = (struct jdb*)malloc(sizeof(struct jdb));
/* */
((SHOP_INSTERFACE*)jdb_shop)->enter = enter_jdb;
((SHOP_INSTERFACE*)jdb_shop)->buy = bug_jdb_capacity;
return (pSHOP_INSTERFACE)jdb_shop;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 - 단순 공장 모델 (C 언어 사례)가 립 창 과 제 다 방 역시 하나의 상점 으로서 진입 과 구 매 등 기본 적 인 기능 이 있어 야 한다.그래서 두 사람 에 게 이 인터페이스 류 를 물 려 받 게 하 는 것 은 당연 하 다. 우리 가 바 라 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.