ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《大话设计模式》——工厂方法模式

2020-02-05 17:08:18  阅读:226  来源: 互联网

标签:推送 账号 微信 大话 send 工厂 设计模式 def


工厂方法模式:定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

介绍

工厂方法模式,又称工厂模式多态工厂模式虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

对比简单工厂模式

是对简单工厂模式的一个延伸,所以它们诞生的背景以及所解决的问题是大同小异。(不了解简单工厂模式的请看《大话设计模式》——简单工厂模式

简单工厂模式

简单来说,简单工厂模式是由一个工厂对象根据不同参数创建不同的实例。具体传什么参数,创建什么实例的逻辑是在工厂对象中完成的。

优点

  • 只需要传入一个正确的参数,就可以获取你所需要的对象而无需知道其创建细节。

缺点

  • 工厂一旦需要生产新产品就需要修改工厂类的方法逻辑,违背了开放—封闭原则
  • 如果产品实例种类很多,也导致了工厂内部逻辑复杂,不易维护。

工厂方法模式

工厂方法模式是对简单工厂模式进一步的解耦。将把原本会因为业务代码而庞大的简单工厂类,拆分成了一个个的工厂类,这样代码就不会都耦合在同一个类里了。

优点

  • 用户只需要关心所需产品的对应工厂,无需关心细节
  • 加入新产品符合开闭原则,提高可扩展性
  • 进一步降低了程序的耦合性

缺点

  • 类的个数容易过多,增加复杂度
  • 增加了系统的抽象性和理解难度

详细介绍

工厂方法模式的四个要素:

  • 抽象产品类(Product):提供抽象方法供具体产品类实现
  • 具体产品类(ConcreteProduct):提供具体的产品
  • 抽象工厂类(Factory):提供抽象方法供具体工厂实现
  • 具体工厂类(ConcreteFactory):提供具体的工厂

使用步骤:

  1. 创建抽象工厂类,定义具体工厂的公共接口;
  2. 创建抽象产品类 ,定义具体产品的公共接口;
  3. 创建具体产品类(继承抽象产品类) ,定义生产的具体产品;
  4. 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
  5. 外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

具体例子:

背景: 现公司监控系统报警需要对接企业微信公众号, 由于未认证企业微信推送消息的限制, 默认每天推送条数上限为6000条, 考虑到报警系统多, 规则没有收敛, 接收的人员多, 每天6000条可能不够用, 所以需要创建多个未认证的企业微信账号用于发送报警信息。

# 抽象工厂类
class WeChatFactory(object):
    def create_wechat(self):
        pass

# 具体工厂类A(创建账号A)
class AccountAFactory(WeChatFactory):
    def create_wechat(self):
        return AccountA()

# 具体工厂类B(创建账号B)
class AccountBFactory(WeChatFactory):
    def create_wechat(self):
        return AccountB()

# 抽象产品类(微信账号功能)
class WeChat(object):
    def send_message(self, content):
        pass

    def send_image(self, imageid):
        pass

# 具体产品类A(账号A功能)
class AccountA(WeChat):
    def send_message(self, content):
        print("使用企业微信账号A推送信息: ", content)

    def send_image(self, imageid):
        print("使用企业微信账号A推送图片: ", imageid)

# 具体产品类B(账号B功能)
class AccountB(WeChat):
    def send_message(self, content):
        print("使用企业微信账号B推送信息: ", content)

    def send_image(self, imageid):
        print("使用企业微信账号B推送图片: ", imageid)



if __name__ == "__main__":
    # 实例化账号A
    wechat_factory_a = AccountAFactory()
    # 创建账号A的微信对象
    wechat1 = wechat_factory_a.create_wechat()
    
    # 使用账号A对象发送信息
    wechat1.send_message(content="haha")
    wechat1.send_image(imageid="hehe.jpg")

    # 实例化账号B
    wechat_factory_b = AccountBFactory()
    # 创建账号B的微信对象
    wechat2 = wechat_factory_b.create_wechat()
    # 使用账号B对象发送信息
    wechat2.send_message(content="heihei")
    wechat2.send_image(imageid="hehe.jpg")

执行结果

使用企业微信账号A推送信息:  haha
使用企业微信账号A推送图片:  hehe.jpg
使用企业微信账号B推送信息:  heihei
使用企业微信账号B推送图片:  hehe.jpg

如果此时, 两个微信账号都不够用了, 需要增加第三个账号时, 所有的类都不需要修改, 只需创建新的类即可, 符合开放封闭原则。

class AccountC(WeChat):
    def send_message(self, content):
        print("使用企业微信账号C推送信息: ", content)

    def send_image(self, imageid):
        print("使用企业微信账号C推送图片: ", imageid)
      
    
class AccountCFactory(WeChatFactory):
    def create_wechat(self):
        return AccountC()

应用场景

  • 当一个类不知道它所需要的对象的类时
    在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可;
  • 当一个类希望通过其子类来指定创建对象时
    在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
  • 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

参考

Python语言实现工厂方法设计模式

打开微信扫一扫,关注【西加加先生】微信公众号,及时接收博文推送
在这里插入图片描述

标签:推送,账号,微信,大话,send,工厂,设计模式,def
来源: https://www.cnblogs.com/ghostlee/p/12264444.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有