zoukankan      html  css  js  c++  java
  • 工厂模式

      工厂模式是通过调用一个简单的函数就可以创建不同的对象,下面就简单讲讲工厂方法和抽象工厂模式

    工厂方法

      工厂方法模式是指定义一个可以根据参数值的不同,而返回不同对象的函数

      案例:我们知道session是保存在服务端的,可以保存在缓存里,数据库...  在不同地方就有不同的保存方式,所以要实例不同session对象

    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
    

       在上面个例子中修改起来也很方便,只要在配置文件里修改即可

    抽象工厂

      一系列的工厂方法组合在一起实现一个抽象工厂

    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')
    

       由于抽象工厂是一系列的工厂方法组合在一起,所以在编程过程时,先工厂方法再抽象工厂

     

  • 相关阅读:
    不等式(一)-Markov与Chebyshev不等式
    决策树学习
    k-NN最近邻算法(k-nearest neighbors algorithm)
    梯度下降(Gradient Descent)数学原理分析与实例
    求解素数
    shell基础命令使用
    安装jenkins
    idea拉取git
    shell常用命令
    linux 安装jdk
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/5942865.html
Copyright © 2011-2022 走看看