设计模式python版(3)-工厂方法模式
2023-09-14 09:12:52 时间
Python设计模式(1)设计模式简介与分类
Python设计模式(2)简单工厂模式
Python设计模式(3)工厂方法模式
Python设计模式(4)抽象工厂模式
Python设计模式(5)建造者模式
Python设计模式(6)单例模式
1、工厂方法简介
- 含义:
定义了一个用于创建对象的接口(工厂接口),让子类决定实现哪一个产品类
角色:具体工厂角色 - 优点:
每个具体产品都对应一个具体工厂类,不需要修改工厂类代码,隐藏了对象创建的实现细节 - 缺点:
每增加一个具体产品类,就必须增加相应的具体工厂类,类的个数规模巨大
2、代码实现如下:
代码如下:
from abc import ABCMeta,abstractmethod
class Person(metaclass=ABCMeta):
@abstractmethod
def get_name(self):
pass
@abstractmethod
def set_name(self,name):
pass
class Student(Person):
def __init__(self):
self.__name=""
def get_name(self):
return self.__name
def set_name(self,name):
self.__name=name
class Teacher(Person):
def __init__(self):
self.__name=""
def get_name(self):
return self.__name
def set_name(self,name):
self.__name=name
class PersonFactory(metaclass=ABCMeta):
@abstractmethod
def create_person(self):
pass
class StudentFactory(PersonFactory):
def create_person(self):
return Student()
class TeacherFactory(PersonFactory):
def create_person(self):
return Teacher()
if __name__=="__main__":
s=StudentFactory().create_person()
t=TeacherFactory().create_person()
s.set_name("Tom")
t.set_name("Mr Jack")
print(s.get_name())
print(t.get_name())
执行结果如下:
Tom
Mr Jack
如果此时增加一个对象类,比如增加一个工人类,则只需要分别增加一个工人类的和生产工人类的工厂类,而原代码可以做到没有任何改动,代码实现如下:
from abc import ABCMeta,abstractmethod
class Person(metaclass=ABCMeta):
@abstractmethod
def get_name(self):
pass
@abstractmethod
def set_name(self,name):
pass
class Student(Person):
def __init__(self):
self.__name=""
def get_name(self):
return self.__name
def set_name(self,name):
self.__name=name
class Teacher(Person):
def __init__(self):
self.__name=""
def get_name(self):
return self.__name
def set_name(self,name):
self.__name=name
class Worker(Person):
def __init__(self):
self.__name=""
def get_name(self):
return self.__name
def set_name(self,name):
self.__name=name
class PersonFactory(metaclass=ABCMeta):
@abstractmethod
def create_person(self):
pass
class StudentFactory(PersonFactory):
def create_person(self):
return Student()
class TeacherFactory(PersonFactory):
def create_person(self):
return Teacher()
class WorkerFactory(PersonFactory):
def create_person(self):
return Worker()
if __name__=="__main__":
s=StudentFactory().create_person()
t=TeacherFactory().create_person()
s.set_name("Tom")
t.set_name("Mr Jack")
print(s.get_name())
print(t.get_name())
w=WorkerFactory().create_person()
w.set_name("张三")
print(w.get_name())
执行结果如下:
Tom
Mr Jack
张三
相关文章
- pycharm 删除项目_pycharm怎么删除python文件
- Python-方法反射
- python实现矩阵的转置_Python实现矩阵转置的方法分析
- 绘图技巧 |Bokeh超强交互式Python可视化库作品分享
- 21天Python进阶学习挑战赛打卡------第4天(字典)
- Python对象的2个内置方法__del__和__str__
- python字符串常用方法及汇总
- Python编程:从入门到实践(选记)「建议收藏」
- 【说站】python缺失值的解决方法
- 【说站】python字符串翻转的方法
- 【说站】python中ConfigParser是什么
- 【说站】python线程通信Condition提供的方法
- 【说站】python绘制散点图的两种方法
- 【说站】python中pyquery初始化的方法
- [1164]python用numpy计算均值,方差,标准差
- python win32api sendmessage_Python win32api.SendMessage方法代码示例[通俗易懂]
- eval在python中是什么意思_如何在Python中使用eval ?
- python交互模式下方向键乱码的正确解决方法
- 有没有一个在线工具可以将Python代码转换为Java代码?
- 为什么C代码比Python代码运行得更快?
- Python面向对象编程-魔术方法-__len__和__getitem__方法
- python scrapy 网络采集使用代理的方法详解编程语言
- 使用Python执行Linux命令的方法(python调用linux命令)
- Python中字典合并的四种方法详解编程语言
- python中?:三元表达式的使用介绍
- python中getattr函数使用方法getattr实现工厂模式
- Python中的__new__与__init__魔术方法理解笔记
- Python编写检测数据库SA用户的方法
- Python下singleton模式的实现方法
- Python实现检测服务器是否可以ping通的2种方法