Python笔记之工厂模式


Posted in Python onNovember 20, 2019

工厂模式: “工厂”即表示一个负责创建其他类型的对象的类,通常情况下,一个工厂的对象会有一个或多个方法与之关联,这些方法用于创建不同类型的对象,工厂对象会根据客户端给方法传递的不同的参数或者客户端调用不同的方法返回不同的对象。

优点:对象的创建是可以根据需要单独创建的,但是使用工厂模式来创建对象有以下优点:

  • 松耦合,对象的创建是根据工厂类来进行的,与类本身的实现是独立开来的。
  • 对于客户端来说,不需要知道类的具体实现,只需要调用相应接口就可以得到需要的对象了,这其实是简化了客户端的相关实现。
  • 对于对象的修改只需要在工厂里面进行即可,包括添加新的对象,客户端只需要更改少量的代码,甚至可以不修改代码就可以达到要求。
  • 使用工厂接口,还可以重用已有的对象,不用去别处调用已有的对象或者重新创建一个对象。

工厂模式的3种实现形式(或者说3中变体):

  • 简单工厂模式:工厂类会提供一个接口,并根据客户端传入参数来创建相应的实例对象。(创建一个对象)
  • 工厂方法模式:需要定义一个基类,不同的子类则代表着不同类型的对象。相对于简单工厂模式而言,工厂方法模式具有更强的可定制性。(创建一个对象)
  • 抽象工厂模式:需要定义一个抽象工厂类,然后由不同的子类来创建不同系列的对象,一个系列即代表一组对象。(创建一组对象)

简单工厂模式示例:

from abc import ABCMeta, abstractmethod


class Flower(metaclass=ABCMeta):
 @abstractmethod
 def show_price(self):
  pass


class Rose(Flower):
 def show_price(self):
  print('Rose price: $99')


class Tulip(Flower):
 def show_price(self):
  print('Tulip price: $66')


class FlowerSimpleFactory:
 def get_flower(self, flower_type):
  return eval(flower_type)()


if __name__ == '__main__':
 flower_factory = FlowerSimpleFactory()
 rose = flower_factory.get_flower('Rose')
 tulip = flower_factory.get_flower('Tulip')
 rose.show_price()
 tulip.show_price()
Rose price: $99
Tulip price: $66

特点:接口根据客户端传入的参数即可返回对应的实例对象,甚至不用返回它的对象就可以进行对应的操作(比如示例中的工厂FlowerSimpleFactory中可以直接定义一个print_price方法来打印各种花的价格,而不是先返回对象,再由对象调用show_price方法来打印),即不会暴露对象的创建逻辑,客户端直接使用接口即可完成对象的创建,甚至创建对象之后的一些操作。

工厂方法模式示例:

from abc import ABCMeta, abstractmethod


class Flower(metaclass=ABCMeta):
 @abstractmethod
 def show_price(self):
  pass


class Rose(Flower):
 def show_price(self):
  print('Rose price: $99')


class Tulip(Flower):
 def show_price(self):
  print('Tulip price: $66')


class Lily(Flower):
 def show_price(self):
  print('Lily price: $33')


class FlowerShopFactory(metaclass=ABCMeta):
 def __init__(self):
  self.flowers = []
  self.stock_flowers()

 @abstractmethod
 def stock_flowers(self):
  pass

 def get_flowers(self):
  return self.flowers

 def add_flower(self, flower):
  self.flowers.append(flower)


class FlowerShop1(FlowerShopFactory):
 def stock_flowers(self):
  self.add_flower(Rose())
  self.add_flower(Tulip())


class FlowerShop2(FlowerShopFactory):
 def stock_flowers(self):
  self.add_flower(Rose())
  self.add_flower(Tulip())
  self.add_flower(Lily())


if __name__ == '__main__':
 flower_shop1 = FlowerShop1()
 for flower in flower_shop1.get_flowers():
  flower.show_price()

 flower_shop2 = FlowerShop2()
 for flower in flower_shop2.get_flowers():
  flower.show_price()
Rose price: $99
Tulip price: $66
Rose price: $99
Tulip price: $66
Lily price: $33

特点:工厂方法可以根据基类来定义不同的子类,如示例中的FlowerShop1和FlowerShop2,每个子类则代表“工厂”可以创建的一个“产品”。即对象的创建是通过继承的子类来完成的。

抽象工厂模式示例:

from abc import ABCMeta, abstractmethod


class MiniCar(metaclass=ABCMeta):
 @abstractmethod
 def show_size(self):
  pass


class SedanCar(metaclass=ABCMeta):
 @abstractmethod
 def show_price(self):
  pass


# 国产车
class DomesticMiniCar(MiniCar):
 def show_size(self):
  print('Domestic mini car size: 111')


class DomesticSedanCar(SedanCar):
 def show_price(self):
  print('Domestic sedan car price: 10W')


# 英国车
class EnglishMiniCar(MiniCar):
 def show_size(self):
  print('English mini car size: 222')
  

class EnglishSedanCar(SedanCar):
 def show_price(self):
  print('English sedan car price: 30w')


# 抽象工厂类
class CarFactory(metaclass=ABCMeta):
 @abstractmethod
 def create_mini_car(self):
  pass

 @abstractmethod
 def create_sedan_car(self):
  pass


# 国产车工厂类
class DomesticCarFactory(CarFactory):
 def create_mini_car(self):
  return DomesticMiniCar()
 
 def create_sedan_car(self):
  return DomesticSedanCar()


# 英国车
class EnglishCarFactory(CarFactory):
 def create_mini_car(self):
  return EnglishMiniCar()
 
 def create_sedan_car(self):
  return EnglishSedanCar()

特点:需要定义一个接口(如示例的抽象工厂类)来创建一系列的相关对象,如示例中的两个子类分别创建两个系列的对象(国产车和英国车),即对象的创建也是由子类来完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的一个火车票转让信息采集器
Jul 09 Python
Python跳出循环语句continue与break的区别
Aug 25 Python
python根据文件大小打log日志
Oct 09 Python
Python实现在线音乐播放器
Mar 03 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
如何用python免费看美剧
Aug 11 Python
Python中qutip用法示例详解
Oct 02 Python
Python识别处理照片中的条形码
Nov 16 Python
python的dict判断key是否存在的方法
Dec 09 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 #Python
将python2.7添加进64位系统的注册表方式
Nov 20 #Python
10个Python面试常问的问题(小结)
Nov 20 #Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 #Python
Python笔记之facade模式
Nov 20 #Python
将python安装信息加入注册表的示例
Nov 20 #Python
如何使用Python脚本实现文件拷贝
Nov 20 #Python
You might like
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
Python温度转换实例分析
2018/01/17 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
美国知名生活购物网站:Goop
2017/11/03 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
鲁迅故居导游词
2015/02/05 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
Java实现房屋出租系统详解
2021/10/05 Java/Android
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android