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 相关文章推荐
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
python分布式环境下的限流器的示例
Oct 26 Python
Django rest framework实现分页的示例
May 24 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
对python中数组的del,remove,pop区别详解
Nov 07 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
Python实现通过解析域名获取ip地址的方法分析
May 17 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
python如何运行js语句
Sep 09 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
Dec 27 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 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
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
python图像常规操作
2017/11/11 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
python计算二维矩形IOU实例
2020/01/18 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
基于CentOS搭建Python Django环境过程解析
2020/08/24 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
澳大利亚家具商店:Freedom
2020/12/17 全球购物
教师评优事迹材料
2014/01/10 职场文书
会计专业求职信
2014/08/10 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
五好家庭申报材料
2014/12/20 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
一行代码python实现文件共享服务器
2021/04/22 Python
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL