python 工厂模式
工厂模式:“工厂”即表示一个负责创建其他类型的对象的类,通常情况下,一个工厂的对象会有一个或多个方法与之关联,这些方法用于创建不同类型的对象,工厂对象会根据客户端给方法传递的不同的参数返回不同的对象。
优点:对象的创建是可以根据需要单独创建的,但是使用工厂模式来创建对象有以下优点:
- 松耦合,对象的创建是根据工厂类来进行的,与类本身的实现是独立开来的。
- 对于客户端来说,不需要知道类的具体实现,只需要调用相应接口就可以得到需要的对象了,这其实是简化了客户端的相关实现。
- 对于对象的修改只需要在工厂里面进行即可,包括添加新的对象,客户端只需要更改少量的代码,甚至可以不修改代码就可以达到要求。
- 使用工厂接口,还可以重用已有的对象,不用去别处调用已有的对象或者重新创建一个对象。
代码
工厂类:
factory_mode.py
#coding:utf-8
'''
python 实现工厂类模式
'''
import os
import sys
import glob
base_suffix = 'Person'
module_suffix = '_' + base_suffix
module_suffix_extension = module_suffix + '.py'
class Singleton(type):
def __new__(cls, name,bases,attrs):
print "run __new__() ...."
cls.__instance = None
return super(Singleton,cls).__new__(cls,name,bases,attrs)
def __call__(self, *args, **kwargs):
print "run __call__() ..."
if self.__instance is None:
print "返回单例对象..."
self.__instance = super(Singleton,self).__call__()
return self.__instance
class Factory(object):
__meta_class__ = Singleton
def __init__(self):
self.__portal_set = {}
self.init()
def init(self):
for pkg in glob.glob('*'+module_suffix_extension):
base_name = os.path.basename(pkg).split(module_suffix_extension)[0]
print base_name
module_name = base_name+module_suffix
module = __import__(module_name, fromlist=[module_name])
print "module:", module
portal_class = getattr(module, base_name)
self.__portal_set.setdefault(base_name, portal_class())
def get_data(self, data_portal_name, **kwargs):
portal_instance = self.__portal_set.get(data_portal_name, None)
if not portal_instance:
return False, 'no such portal'
return portal_instance.get_data(**kwargs)
if __name__ == '__main__':
#工厂类 根据 客户端传入的参数的不同,返回相应的数据
factory = Factory()
kwargs = {"name":"nlj", "age":30}
#返回女士的信息
data = factory.get_data("Male", **kwargs)
print data
产品类:
Person.py
from abc import ABCMeta, abstractmethod
class Person(object):
__metaclass__ = ABCMeta
def __init__(self):
pass
@abstractmethod
def get_data(self):
pass
Male_Person.py
#coding:utf-8
from Person import Person
class Male(Person):
def __init__(self):
pass
def get_data(self,**kwargs):
print("Hello Mr.", kwargs)
return kwargs
Femal_person.py
#coding:utf-8
from Person import Person
class Female(Person):
def __init__(self):
pass
def get_data(self, **kwargs):
print("Hello Mr.", kwargs)
return kwargs