简单的工厂设计模式

  1. 什么是设计模式

设计模式(Design pattern)通常描述了一组相互紧密的类与对象,代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

  • 代码设计经验的总结,稳定,拓展性更强,一系列编程思想,打破新手写代码的乱

  • 算法不是设计模式,因为算法致力于解决问题而非设计问题

c…面向过程,不太友好的面向对象语言
Java 面向对象

建筑设计领域引入计算机科学中来的
23种 代码更容易被人理解,保证代码可靠性,程序的重用性。

二、什么是类和对象

类是一种用户定义的引用数据类型,也称类类型。与C语言中的结构体类似

struct Animal{
        char name[128];
        int age;
        int sex;//成员属性
        void (*peat)();
        void (*pbeat)();//成员方法
        void (*test)();
       struct Animal *next;
};

对象:日常生活中的所有东西都是对象,是类的实例化,类的一种具象

类:具有同种属性的对象称为类,抽象概念

三、什么是工厂模式

工厂模式(Factory Pattern)是中最常用的设计模式之一。主要解决接口选择的问题。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的(最佳)方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
四、代码实现

mainPro.c

#include "animal.h" 
#include <string.h>
struct Animal* findUtilByName(char *str,struct Animal *phead)//从动物工厂找对应动物
{
    struct Animal *tmp = phead;//定义结构体指针指向动物工厂链表头
    //运用指针需加上空值判断,防止野指针
    if(phead == NULL){
        printf("error in link\n");
        return NULL;
    }else{
        while(tmp != NULL){          //遍历链表
            if(strcmp(tmp->name,str) == 0){
                return tmp;//找到对应动物,返回该结构体指针
            }
            
            tmp=tmp->next;
        }
        return NULL;//找不到返回空
    }

}
int main()
{
    char buf[128] = {'\0'};//定义字符数组 处理128个字节
    struct Animal *phead = NULL;//定义动物工厂链表头
    struct Animal *ptmp;//定义临时结构体指针变量
    //将动物加入动物工厂
    phead = putCatInLink(phead);
    phead = putDogInLink(phead);
    phead = putPersonInLink(phead);
    phead = putHorseInLink(phead);
    while(1){
    
        printf("input:Tom,huang,horse,zhengyanfeng\n");
        scanf("%s",buf);

        ptmp = findUtilByName(buf,phead);//找到对应动物结构体
        if(ptmp != NULL){
            ptmp->pbeat();//调用函数
            ptmp->peat();
        }
        memset(buf,'\0',sizeof(buf));//清空数组
    }
    return 0;
}

animal.h

#include <stdio.h>
//函数声明
struct Animal* putPersonInLink(struct Animal *phead);
struct Animal* putDogInLink(struct Animal *phead);
struct Animal* putCatInLink(struct Animal *phead);
struct Animal* putHorseInLink(struct Animal *phead);


//定义动物结构体
struct Animal{
        char name[128];
        int age;
        int sex;//成员属性
        void (*peat)();//函数指针
        void (*pbeat)();//成员方法
        void (*test)();
       struct Animal *next;
};

cat.c

#include "animal.h"


void catEat()
{
    printf("cat eat fish\n");
}


void catBeat()
{
    printf("cat beat your brother\n");
}

//结构体初始化
struct Animal cat={
    .name = "Tom",    
    .peat = catEat,
    .pbeat= catBeat
};
//头插法加入动物工厂
struct Animal* putCatInLink(struct Animal *phead)
{

    if(phead == NULL){
        phead = &cat;

        return phead;
    }else{
        cat.next = phead;
        phead = &cat;
        return phead;
    }

}

Dog.c

#include "animal.h"


void dogEat()
{
        printf("dog eat shit\n");
}

void dogBeat()
{
        printf("dog bite your litter brother\n");
}


struct Animal dog={
    .name = "huang",
    .peat = dogEat,
    .pbeat= dogBeat
};

struct Animal* putDogInLink(struct Animal *phead)
{

    if(phead == NULL){
        phead = &dog;

        return phead;
    }else{
        dog.next = phead;
        phead = &dog;
        return phead;
    }

}

Horse.c

#include "animal.h"


void horseEat()
{
    printf("horse eat grass\n");
}


void horseBeat()
{
    printf("horse beat your brother\n");
}


struct Animal horse={
    .name = "horse",    
    .peat = horseEat,
    .pbeat= horseBeat
};

struct Animal* putHorseInLink(struct Animal *phead)
{

    if(phead == NULL){
        phead = &horse;

        return phead;
    }else{
        horse.next = phead;
        phead = &horse;
        return phead;
    }

}

Person.c

#include "animal.h"


void personEat()
{
        printf("human eat fish\n");
}


void personBeat()
{
        printf("person hit your litter brother\n");
}



struct Animal person={
    .name = "zhengyanfeng",
    .peat = personEat,
    .pbeat= personBeat
};

struct Animal* putPersonInLink(struct Animal *phead)
{

    if(phead == NULL){
        phead = &person;

        return phead;
    }else{
        person.next = phead;
        phead = &person;
        return phead;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值