디자인 모델 - 단순 공장 모델 (C 언어 사례)

디자인 모델 - 단순 공장 모델
일 모드 동기
먼저 이런 수 요 를 살 펴 보 겠 습 니 다. 이날 당신 의 첫째 가 당신 에 게 말 했 습 니 다. "샤 오리, 회사 의 재료 가 부족 합 니 다. 당신 은 가 립 창 상점 에 가서 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; } }

좋은 웹페이지 즐겨찾기