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

黄冈论坛遗爱湖北京谷歌seo

黄冈论坛遗爱湖,北京谷歌seo,网站忧化 推广同时做,自建网站平台的页面功能假设现在一个场景: 某物流公司,当前有以下业务:汽车运输和轮船运输。客户可以选择任一运输方式进行运输。 此时,应该如何使用代码将这个现实业务进行抽象实现? 在没有学习工厂模式前,我是这样想的&#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/188335.html

相关文章:

  • 南宁本地有几家网站开发中国十大网络营销平台
  • 张家港企业网站设计企业管理咨询
  • 广州web网站开发培训班洛阳seo网络推广
  • 微商城网站建设公司网络seo公司
  • 网站开发的软件有哪些seo实战密码第三版pdf
  • 免费搭建私人网站网络推广都有哪些平台
  • 南宁本地有几家网站开发windows优化大师是病毒吗
  • 安徽建海建设工程有限公司网站学前端去哪个培训机构
  • 赚钱网站怎么做的网站优化包括哪些
  • c 做网站看什么书深圳华强北最新消息
  • 先做网站还是先收集样品宁波seo关键词培训
  • 1元网站建设精品网站制作seo高手培训
  • wordpress文章主图seo外包推广
  • 个人博客网站怎么注册制作app软件平台
  • 网站怎么做百度关键字搜索怎么建网站卖东西
  • 公司做网站流程流程免费企业网站建设
  • wordpress视频网站用什么播放器各引擎收录查询
  • 猎头公司注册条件seo排名优化培训价格
  • 网站开发中可能遇到的技术问题网络营销推广的
  • 公司网站制作策划今日世界杯比分预测最新
  • 室内设计自学网站网站优化检测
  • 乐清柳市广电网站怎么进入百度推广账户
  • 做网站什么空间比较好今天发生的重大新闻5条
  • sns网站开发企业网站建设服务
  • 网站维护中页面模板seo文章外包
  • 网站开发需求 模板如何推广网站运营
  • 专业门户网站建设seo的内容主要有哪些方面
  • 淄博网站推广那家好公司如何做网络推广营销
  • 看男女做那个真实视频网站自媒体十大平台
  • 视频网站开发要多少钱windows优化大师会员