工厂方法模式
:定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
是对简单工厂模式的一个延伸,所以它们诞生的背景以及所解决的问题是大同小异。(不了解简单工厂模式的请看《大话设计模式》——简单工厂模式)
简单来说,简单工厂模式是由一个工厂对象根据不同参数创建不同的实例。具体传什么参数,创建什么实例的逻辑是在工厂对象中完成的。
优点:
缺点:
工厂方法模式是对简单工厂模式进一步的解耦。将把原本会因为业务代码而庞大的简单工厂类,拆分成了一个个的工厂类,这样代码就不会都耦合在同一个类里了。
优点:
缺点:
背景: 现公司监控系统报警需要对接企业微信公众号, 由于未认证企业微信推送消息的限制, 默认每天推送条数上限为
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()
打开微信扫一扫,关注【西加加先生】微信公众号,及时接收博文推送。
原文:https://www.cnblogs.com/ghostlee/p/12264444.html