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

上海网站优化加盟信息流优化师招聘

上海网站优化加盟,信息流优化师招聘,域名卖给别人有风险吗,b2c网站建设 模板假设现在一个场景: 某物流公司,当前有以下业务:汽车运输和轮船运输。客户可以选择任一运输方式进行运输。 此时,应该如何使用代码将这个现实业务进行抽象实现? 在没有学习工厂模式前,我是这样想的&#x…

假设现在一个场景:
某物流公司,当前有以下业务:汽车运输和轮船运输。客户可以选择任一运输方式进行运输。

此时,应该如何使用代码将这个现实业务进行抽象实现?

在没有学习工厂模式前,我是这样想的,分别写个物流公司的类,然后它依赖汽车类和轮船类,让汽车类和轮船都实现运输接口,然后让用户传递一个参数,参数将决定给用户返回汽车或者轮船,这样就实现了。
在这里插入图片描述

代码如下:

from abc import ABC,abstractmethodclass Logistics:def __init__(self,transport):self.transport_map = {"car":Car(),"ship":Ship()}self.transport = self.transport_map[transport]def deliver(self):return self.transport.deliver()class Delivery(ABC):@abstractmethoddef deliver(self):passclass Car(Delivery):def deliver(self):return "A car has delivered."class Ship(Delivery):def deliver(self):return "A ship has deliverd"def client(transport):print(Logistics(transport).deliver())if __name__ == "__main__":client("car")client("ship")

执行结果如下:
在这里插入图片描述

这样写是能够满足这篇文章最初的要求的,但是随着公司的扩展,业务又支持火车运输了,此时,应该怎么写代码?一定是要修改Logistic类的对吗?每增加一种运输方式,我们就要修改一次Logistics类的代码,对吗?

此时就存在一个问题,我们违背了SOLID原则中的开闭原则:对修改关闭,对扩展开放。我们这里只是写了一个很简单的场景,实际的场景中,一旦违背这个原则,可能会引入很多问题,甚至会威胁软件本身。比如,我们要将一个系统提供给用户,让用户可以自定义增加运输类型,让用户修改代码,或者让用户写的代码通过我们提供的方式植入到原有的代码中,都可能会带来安全隐患。

此时,我们可以通过工厂模式,让父类决定对外的功能,让子类决定创建的具体的对外服务的对象,则可以在不修改代码的情况下,进行扩展。

比如这个在这个题目中,我们让物流公司(后面称为总公司)下面创建两个子公司:陆路物流公司、海洋物流公司。物流总公司定义一个创建运输工具的接口,让子公司通过实现这个接口来创建自己的运输工具。物流总公司定义“运输”的方法,所有它的子公司都将支持“运输”。至于“运输”如何实现,可以让子公司来实现,也可以让运输工具来实现,都是可以的,但是出于对以后扩展性的考虑,可以让运输工具来实现。因为,比如让陆路物流公司实现“运输”方法,那意味着陆路公司只有1种“运输”方法,那么万一这个陆路物流公司后面又支持了火车运输怎么办?而如果让汽车这个运输工具来实现运输方法,则当以后陆路物流公司支持火车运输时,火车可以扩展出自己的运输方法。
在这里插入图片描述
代码如下:

from abc import ABC,abstractmethodclass Logistics(ABC):@abstractmethoddef createTransport(self):passdef planDelivery(self):transport = self.createTransport()result = transport.deliver()return resultclass Transport(ABC):@abstractmethoddef deliver(self):passclass RoadLogistics(Logistics):def createTransport(self):return Car()class SeaLogistics(Logistics):def createTransport(self):return Ship()class Car(Transport):def deliver(self):return "A new car has delivered."class Ship(Transport):def deliver(self):return "A new ship has delivered."def client(logistic):print(logistic.planDelivery())if __name__ == "__main__":client(RoadLogistics())client(SeaLogistics())

执行结果如下:
在这里插入图片描述

总结:当不同子类有一些差别时,我们可以把创建对象的工作让子类来完成,此时就可以用工厂模式。

http://www.dtcms.com/wzjs/277623.html

相关文章:

  • 电子商务网站计划书关键词seo深圳
  • 做网站做本地服务器日结app推广联盟
  • 做网站的网页网站点击量与排名
  • 重庆政府公众信息网四川seo技术培训
  • 网站用亚马逊做标题会侵权吗网站你应该明白我的意思吗
  • 建设厅网站查询电工证件seo优化推广公司
  • 建设淘宝客网站.lc和evseo下载站
  • 成都旅游攻略带孩子三日游在线seo优化
  • wordpress支持代码高亮优化公司结构
  • 重庆独立站网站制作设计获客活动营销的方式有哪些
  • 网站商城定制网站建设网络推广最好的网站有哪些
  • 好用的软件下载网站各大网站收录查询
  • 百度云盘做网站空间seo推广思路
  • 吉林省四平市网站建设谷歌seo网站推广怎么做优化
  • 什么网站帮人做网页东莞做网站哪个公司好
  • 网页设计宣传推广方案网站关键词排名优化
  • 万柏林网站建设优化方案模板
  • 新闻网站页面的设计与制作公司网址
  • 用html5做的网站源码上首页seo
  • 腾讯的网站是谁做的互联网去哪里学
  • 网站 文件注入代做百度收录排名
  • 标准型网站建设开发市场seo是什么意思
  • 外贸网站定制开发网络营销主要学什么
  • h5制作网站 有哪些济南专业做网站
  • 网站开发er图海南快速seo排名优化
  • 西安建设学院网站首页超级seo外链工具
  • wordpress 大前端2.0seo专业培训中心
  • 做那个网站比较好淘宝指数官网
  • 做网站时空间的选择太原做网站哪家好
  • app 展示网站网页设计与制作知识点