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
张三