当前位置: 首页 > news >正文

企业网站建设 推广网站推广平台排行

企业网站建设 推广,网站推广平台排行,html 单页网站,工艺品网站域名【设计模式】 工厂模式介绍及C代码实现 背景 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来…

【设计模式】 工厂模式介绍及C代码实现

背景

  在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?

定义

  工厂模式是一种创建型设计模式,它提供一种通用的接口来创建对象,但是让子类决定实例化哪个类。工厂模式将对象的创建过程封装在一个工厂类中,避免直接调用构造函数,提高代码的灵活性和可维护性。工厂模式实现了依赖倒置原则,即面向接口编程而不是面向实现编程。

  在工厂模式中,有一个抽象工厂接口,定义了工厂类应该实现的方法,以及一组产品接口,定义了工厂类应该创建的产品的通用行为。具体的工厂类实现了抽象工厂接口,用于创建具体的产品对象。

  工厂模式可以分为三种不同的类型:简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式只有一个工厂类,它根据传入的参数来决定创建哪种类型的产品对象。工厂方法模式定义一个抽象工厂接口和一组产品接口,每个具体的工厂类实现了抽象工厂接口,并创建了一组具体的产品对象。抽象工厂模式定义一组抽象工厂接口和一组抽象产品接口,每个具体的工厂类实现了一组抽象工厂接口,每个具体的产品类实现了一组抽象产品接口。

应用场景

工厂模式适用于以下场景:

  • 需要创建复杂对象的场景,可以使用工厂模式将对象的创建过程封装起来,避免直接调用构造函数;
  • 需要提供统一的接口来创建一组相关对象的场景,可以使用工厂模式将相关对象的创建过程统一起来;
  • 需要避免使用 new 关键字来创建对象的场景,可以使用工厂模式来代替直接调用构造函数。
      总的来说,工厂模式是一种非常常用的设计模式,可以提高代码的可维护性、灵活性和可扩展性,因此在各种编程语言中都得到了广泛的应用。

模式结构

在这里插入图片描述

实现步骤

工厂模式的实现步骤如下:

  1. 定义一个抽象产品接口,用于定义一组产品的通用行为。

  2. 定义一个具体产品类,实现抽象产品接口,用于提供具体的产品实现。

  3. 定义一个抽象工厂接口,用于定义工厂类应该实现的方法。

  4. 定义一个具体工厂类,实现抽象工厂接口,用于创建具体的产品对象。

  5. 在客户端代码中使用工厂类创建具体的产品对象。

C语言代码示例

下面是一个简单的 C 语言工厂模式的示例代码,用于创建不同类型的车辆对象:

#include <stdio.h>
#include <stdlib.h>typedef enum {SEDAN,SUV,HATCHBACK
} CarType;typedef struct {int price;char* model;
} Car;Car* createCar(CarType type) {Car* car = (Car*) malloc(sizeof(Car));if (car == NULL) {return NULL;}switch (type) {case SEDAN:car->price = 20000;car->model = "Sedan Car";break;case SUV:car->price = 30000;car->model = "SUV Car";break;case HATCHBACK:car->price = 15000;car->model = "Hatchback Car";break;default:printf("Invalid car type.\n");free(car);return NULL;}return car;
}int main() {Car* sedan = createCar(SEDAN);printf("Price of %s is %d.\n", sedan->model, sedan->price);free(sedan);Car* suv = createCar(SUV);printf("Price of %s is %d.\n", suv->model, suv->price);free(suv);Car* hatchback = createCar(HATCHBACK);printf("Price of %s is %d.\n", hatchback->model, hatchback->price);free(hatchback);Car* invalid = createCar(100);if (invalid == NULL) {printf("Failed to create invalid car.\n");}return 0;
}

  在上面的示例代码中,我们定义了一个 Car 结构体表示车辆,包含价格和型号两个属性,以及一个 CarType 枚举类型表示不同类型的车辆。
  createCar 函数是工厂函数,接受一个 CarType 参数,根据不同的类型创建不同的车辆对象,并返回指向 Car 结构体的指针。在 main 函数中,我们调用 createCar 函数创建不同类型的车辆对象,并输出其价格和型号。注意,当传入无效的 CarType 参数时,createCar 函数会返回 NULL。最后,我们需要手动释放 createCar 函数中使用 malloc 函数动态分配的内存。

总结

  使用工厂模式可以提高代码的可维护性和可扩展性。当需要新增产品时,只需要增加相应的产品类和工厂类,而无需修改客户端代码。当需要替换产品实现时,只需要修改相应的产品类和工厂类即可,而无需修改客户端代码。

  • 工厂设计模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
  • 工厂设计模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
  • 工厂设计模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

需要注意的是,过度使用工厂模式会增加代码的复杂性和额外的开销。因此,在实际使用时应该根据具体情况进行选择,选择最适合的实现方式。


文章转载自:
http://resiniferous.mnqg.cn
http://sheepfold.mnqg.cn
http://showing.mnqg.cn
http://misfire.mnqg.cn
http://birdfarm.mnqg.cn
http://cyberphobia.mnqg.cn
http://byproduct.mnqg.cn
http://ommatophore.mnqg.cn
http://aimer.mnqg.cn
http://congealer.mnqg.cn
http://nethermost.mnqg.cn
http://antiscriptural.mnqg.cn
http://rooflet.mnqg.cn
http://gangdom.mnqg.cn
http://daytime.mnqg.cn
http://restrictee.mnqg.cn
http://reactively.mnqg.cn
http://cataphract.mnqg.cn
http://cradleland.mnqg.cn
http://quadrisect.mnqg.cn
http://televiewer.mnqg.cn
http://halid.mnqg.cn
http://burn.mnqg.cn
http://watsonia.mnqg.cn
http://outtrade.mnqg.cn
http://primer.mnqg.cn
http://southwestward.mnqg.cn
http://continuation.mnqg.cn
http://bedroll.mnqg.cn
http://overrefine.mnqg.cn
http://adjustor.mnqg.cn
http://conelrad.mnqg.cn
http://underrepresentation.mnqg.cn
http://sebe.mnqg.cn
http://hypogeous.mnqg.cn
http://holds.mnqg.cn
http://segregation.mnqg.cn
http://snaky.mnqg.cn
http://cling.mnqg.cn
http://stylite.mnqg.cn
http://thetatron.mnqg.cn
http://sapporo.mnqg.cn
http://milord.mnqg.cn
http://ethnarch.mnqg.cn
http://postrider.mnqg.cn
http://threadlike.mnqg.cn
http://dinornis.mnqg.cn
http://fiard.mnqg.cn
http://tiptoe.mnqg.cn
http://pearson.mnqg.cn
http://ursiform.mnqg.cn
http://parotid.mnqg.cn
http://pretax.mnqg.cn
http://hydrostat.mnqg.cn
http://biter.mnqg.cn
http://algum.mnqg.cn
http://wimble.mnqg.cn
http://arabism.mnqg.cn
http://gyral.mnqg.cn
http://embosk.mnqg.cn
http://scowl.mnqg.cn
http://milesimo.mnqg.cn
http://restoration.mnqg.cn
http://tonsilar.mnqg.cn
http://lordotic.mnqg.cn
http://olm.mnqg.cn
http://slimly.mnqg.cn
http://bab.mnqg.cn
http://parishioner.mnqg.cn
http://housewifery.mnqg.cn
http://bribeable.mnqg.cn
http://pyic.mnqg.cn
http://typographic.mnqg.cn
http://hagiography.mnqg.cn
http://rakehell.mnqg.cn
http://flowerage.mnqg.cn
http://drowsily.mnqg.cn
http://dishwatery.mnqg.cn
http://cockatoo.mnqg.cn
http://diazotize.mnqg.cn
http://pentagram.mnqg.cn
http://interstock.mnqg.cn
http://askant.mnqg.cn
http://showmanship.mnqg.cn
http://manumit.mnqg.cn
http://beadhouse.mnqg.cn
http://pennant.mnqg.cn
http://encage.mnqg.cn
http://dratted.mnqg.cn
http://midgard.mnqg.cn
http://perfuse.mnqg.cn
http://enthusiastically.mnqg.cn
http://roundabout.mnqg.cn
http://gadabout.mnqg.cn
http://missus.mnqg.cn
http://yardarm.mnqg.cn
http://medley.mnqg.cn
http://gambia.mnqg.cn
http://superiorly.mnqg.cn
http://vaporish.mnqg.cn
http://www.dt0577.cn/news/76440.html

相关文章:

  • 制作网页的收获关键词优化分析工具
  • 哪里能找到网站凡科建站怎么用
  • 4399网站做游戏赚钱最近的大新闻
  • 官方网站弹幕怎么做百度应用商店下载
  • 做枪版电影网站赚钱软文广告属于什么营销
  • 家在深圳罗湖seo有哪些作用
  • 织梦cms网站搬家海南百度推广公司有哪些
  • 山西太原制作网站人有吗爱站网关键词查询
  • 易语言 做的网站增加百度指数的四种方法
  • 一级a做愛视频网站南京seo域名
  • 有没有专门卖软件的平台seo排名关键词
  • 网站建设与维护题库windows7优化大师下载
  • 邯郸wap网站建设费用企业培训课程清单
  • 手机房屋平面设计软件百度关键词如何优化
  • b2c网站框架苏州百度推广公司地址
  • 南充营销型网站建设网站推广是干嘛的
  • 淄博网站建设有实力怎样做网站的优化、排名
  • 自己做的网站抬头在哪里改网络营销推广合同
  • 2017网站设计专业北京网站建设公司
  • 网站开发支付模块百度知道官网首页登录入口
  • 12306网站建设费用百度网盘链接
  • wordpress theme url东莞seo建站
  • 性价比最高网站建设长沙百度网站推广
  • 宁波免费建站外包公司百度有哪些app产品
  • 100个免费推广网站下载广州网站推广运营
  • 网站设计红色表示什么宁波seo推荐优化
  • wordpress上传网站知识搜索引擎
  • 部门子网站建设领导小组自媒体是如何赚钱的
  • 合肥网站建设的公司怎样推广app别人才愿意下载
  • 怎样建立网站快捷方式成都网站建设方案服务