工厂模式
工厂模式是通过调用一个简单的函数就可以创建不同的对象,下面就简单讲讲工厂方法和抽象工厂模式
工厂方法
工厂方法模式是指定义一个可以根据参数值的不同,而返回不同对象的函数
案例:我们知道session是保存在服务端的,可以保存在缓存里,数据库... 在不同地方就有不同的保存方式,所以要实例不同session对象
1 2 3 4 5 6 7 8 9 10 11 12 13 | class SessionFactory: @staticmethod def get_session_obj(handler): obj = None if config.SESSION_TYPE = = "cache" : obj = CacheSession(handler) elif config.SESSION_TYPE = = "memcached" : obj = MemcachedSession(handler) elif config.SESSION_TYPE = = "redis" : obj = RedisSession(handler) return obj |
在上面个例子中修改起来也很方便,只要在配置文件里修改即可
抽象工厂
一系列的工厂方法组合在一起实现一个抽象工厂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | class JSONParser: def parse( self , raw_data): return json.loads(raw_data) class XMLParser: def parse( self , raw_data): return xml2dict(raw_data) def new_parser( type , * * kwargs): if type = = 'json' : return JSONParser() elif type = = 'xml' : return XMLParser() parser = new_parser( 'json' ) with open ( 'hello.json' ) as fp: data = parser.parse(fp.read()) print (data) class DBSaver: def save( self , obj, * * kwargs): model = Model( * * obj) model.save() class FileSaver: def __init__( self , save_dir): self .save_dir = save_dir def save( self , obj, name): path = os.path.join( self .save_dir, name) with open (path, 'wb' ) as fp: data = json.dumps(obj) fp.write(data) def new_saver( type , * * kwargs): if type = = 'db' : return DBSaver() elif type = = 'file' : save_dir = kwargs[ 'save_dir' ] return FileSaver(save_dir) class FileHandler: def __init__( self , parse_type, save_type, * * kwargs): self .parser = new_parser(parse_type, * * kwargs) self .saver = new_saver(save_type, * * kwargs) def do( self , data, filename): obj = self .parser.parse(data) self .saver.save(obj, filename) handler = FileHandler( 'json' , 'file' , save_dir = 'save' ) with open ( 'hello.json' ) as fp: data = fp.read() handler.do(data, 'data.json' ) |
由于抽象工厂是一系列的工厂方法组合在一起,所以在编程过程时,先工厂方法再抽象工厂
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步