python 工厂模式

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值