天天看點

簡單工廠模式的實作

軟體設計模式,又稱設計模式,是一套被反複使用,多數人知曉的,經過分類編目的。代碼設計經驗的總結。使用設計模式是為了可重用代碼,讓代碼更容易被他人了解,保證代碼可靠性,程式的重用性。設計模式一共有23種。算法不是設計模式,因為算法緻力于解決問題而非設計問題。

設計模式通常描述了一組互相緊密作用的類與對象,c面向過程,是一門不太友好的面向對象的語言,java面向對象。

什麼是類與對象?

類是一種使用者定義的引用資料類型,也稱類類型。類是一種抽象的概念,每個類包含資料說明和一組操作資料或傳遞消息的函數,對象是類的一種具體的實列。

例如:

類:struct  Animal {

                   char   name [128];

                    int age;

                    int sex;

                   void  (*peat)();

                  void  (*pbeat)();

}

對象:

            struct  Animal  dog;

            struct  Animal   cat;

            struct  Anima    person;

什麼是工廠模式?

工廠模式(Factory  Pattern)是最常用的設計模式之一。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。

在工廠模式中,我們在建立對象時不會對用戶端暴露建立邏輯,并且是通過使用一個共同的接口來指向新建立的對象。

例如:

Animal.h檔案如下:

1 #include <stdio.h>
  2 
  3 struct Animal {
  4 
  5             char name [128];
  6             int age;
  7             int sex;
  8            void (*pbeat)();
  9            void (*peat)();
 10 
 11            struct Animal *next;
 12 
 13 };
 14 
 15 
 16 struct Animal *putdogintolink(struct Animal *phead);
 17 struct Animal *putcatintolink(struct Animal *phead);
 18 struct Animal *putpersonintolink(struct Animal *phead);
           

cat.c檔案如下:

1 #include "Animal.h"
  2 
  3 
  4 void catBeat()
  5 {
  6       printf("貓抓撓\n");
  7 
  8 }
  9 void catEat()
 10 {
 11       printf("貓吃魚\n");
 12 }
 13 
 14 
 15 
 16 
 17 /*對象  “貓”  */
 18 struct Animal cat = {
 19 
 20          .name = "Tom",
 21          .age  = 10,
 22          .pbeat = catBeat,
 23          .peat  = catEat
 24 
 25 
 26 };
 27 
 28 /*插傳入連結表函數*/
 29 struct Animal *putcatintolink(struct Animal *phead)
 30 {
 31         if(phead == NULL)
 32         {
 33                 return  &cat;
 34         }
 35         else
 36         {
 37                cat.next = phead;
 38                phead = &cat;
 39 
 40                 return phead;
 41         }
 42 
 43 }
           

dog.c檔案如下:

1 #include "Animal.h"
  2 
  3 
  4 
  5 void dogBeat()
  6 {
  7     printf("狗撕咬\n");
  8 }
  9 
 10 
 11 void dogEat()
 12 {
 13     printf("狗吃剩飯\n");
 14 }
 15 
 16 
 17 
 18 /*對象 “狗” */
 19 struct Animal dog ={
 20 
 21           .name = "xiaohui",
 22           .age  = 5,
 23           .pbeat =dogBeat,
 24           .peat  = dogEat,
 25 
 26 
 27 
 28 };
 29 
 30 /*插傳入連結表函數*/
 31 struct Animal *putdogintolink(struct Animal *phead)
 32 {
 33         if(phead == NULL)
 34           {
 35                return &dog;
 36           }
 37         else
 38           {
 39               dog.next = phead;
 40               phead = &dog;
 41 
 42               return  phead;
 43           }
 44 }
           

person.c檔案如下:

1 #include "Animal.h"
  2 
  3 
  4 void personBeat()
  5 {
  6     printf("人用武器\n");
  7 }
  8 
  9 void personEat()
 10 {
 11     printf("人吃飯\n");
 12 }
 13 
 14 
 15 
 16 
 17 /* 對象  “人” */
 18 struct Animal person ={
 19 
 20          .name = "xiaoming",
 21          .age  = 25,
 22          .pbeat = personBeat,
 23          .peat  = personEat
 24 
 25 };
 26 
 27 /*插傳入連結表函數*/
 28 struct Animal *putpersonintolink(struct Animal *phead)
 29 {
 30         if(phead == NULL)
 31         {
 32                 return &person;
 33         }
 34         else
 35         {
 36                person.next = phead;
 37                phead = &person;
 38 
 39 
 40                 return phead;
 41         }
 42 
 43 }
           

main.c檔案如下:

1 #include "Animal.h"
  2 #include <string.h>
  3 
  4 
  5 /*擷取目标對象函數*/
  6 struct Animal *getDes(char *name,struct Animal *phead)
  7 {
  8         struct Animal *temp = phead;
  9 
 10         if(phead == NULL){
 11 
 12                 return NULL;
 13         }
 14         else
 15         {
 16               /*周遊連結清單*/
 17               while(temp != NULL){
 18 
 19                       if(strcmp(name,temp->name) == 0)
 20                       {
 21                             return temp;
 22                       }
 23                       temp = temp->next;
 24 
 25                }
 26 
 27               return NULL;
 28         }
 29 
 30 }
 31 
 32 int main ()
 33 {
 34     char buf[128]={'\0'};
 35     struct Animal *phead = NULL;
 36     struct Animal *des = NULL;
 37 
 38     /*将對象做成一個連結清單*/
 39     phead = putdogintolink(phead);
 40     phead = putcatintolink(phead);
 41     phead = putpersonintolink(phead);
 42 
 43     while(1){
 44 
 45 
 46     printf("請輸入對象的名字\n");
 47     scanf("%s",buf);
 48 
 49 
 50 
 51     des = getDes(buf,phead);//擷取目标對象
 52 
 53     if(des == NULL)
 54     {
 55             printf("目标對象不存在\n");
 56     }
 57     else
 58     {
 59 
 60             des->pbeat();
 61             des->peat();
 62     }
 63 
 64       memset(buf,'\0',sizeof(buf));/*清空buf*/
 65 
 66     }
 67 
 68 
 69 
 70 
 71 
 72 }
           

每添加一個對象就增加一個檔案,在頭檔案中申明類類型和插傳入連結表函數。在主程式中形成對象連結清單。根據對象的名字 來周遊連結清單,來找到目标對象。進而實作調用對象裡面的功能函數。

繼續閱讀