工厂函数(Factory Function)不同于构造函数,工厂函数就是一个普通函数,通常用于创建对象或实例。它的核心思想是通过一个函数来封装对象的创建逻辑,而不是直接使用类的构造函数。工厂函数可以根据输入参数动态地决定创建哪种类型的对象,从而提供更高的灵活性和可扩展性。
工厂函数的特点
-
封装创建逻辑:工厂函数隐藏了对象的创建细节,使得调用者不需要关心对象是如何被创建的。
-
动态创建对象:可以根据输入参数动态决定创建哪种类型的对象。
-
不依赖于类的构造函数:工厂函数通常不直接使用
new
关键字,而是通过内部逻辑来创建对象。 -
可扩展性强:在不修改现有代码的情况下,可以轻松添加新的对象类型。
工厂函数的用途
工厂函数常用于以下场景:
-
当对象的创建逻辑复杂时,可以将创建逻辑封装到工厂函数中,使代码更清晰。
-
当需要根据不同的条件创建不同类型的对象时,工厂函数可以根据输入参数动态选择对象类型。
-
在某些编程语言中,工厂函数可以用于避免直接使用类的构造函数,从而实现更灵活的设计模式。
举例说明:
在某个项目中有大量的redis,一旦Redis服务器发生了变化,比如改了IP地址,项目的每个地方需要配置特别麻烦。所以,就使用了工厂函数。
在database.py中配置:
REDIS_CONFIG = {
"host": getenv("REDIS_HOST", "127.0.0.1"),
"port": int(getenv("REDIS_PORT", "6379")),
"db": int(getenv("REDIS_DB", "0")),
"password": getenv("REDIS_PASSWORD", None),
"encoding": "utf8",
"pool_minsize": int(getenv("REDIS_POOL_MINSIZE", "1")),
"pool_maxsize": int(getenv("REDIS_POOL_MAXSIZE", "10")),
"timeout": int(getenv("REDIS_TIMEOUT", "5"))
}
def get_redis_client(decode_responses: bool = True) -> redis.Redis:
"""获取Redis客户端实例
Args:
decode_responses: 是否自动解码响应数据为字符串
Returns:
Redis: Redis客户端实例
"""
return redis.Redis(
host=getenv("REDIS_HOST", "172.23.151.30"),
port=int(getenv("REDIS_PORT", "6379")),
db=int(getenv("REDIS_DB", "0")),
password=getenv("REDIS_PASSWORD", ""),
socket_timeout=int(getenv("REDIS_TIMEOUT", "5")),
socket_connect_timeout=int(getenv("REDIS_TIMEOUT", "5")),
pool_minsize=int(getenv("REDIS_POOL_MINSIZE", "1")),
pool_maxsize=int(getenv("REDIS_POOL_MAXSIZE", "10")),
decode_responses=decode_responses
)
在各个文件中生成redis_client :
from config.database import get_redis_client
# Redis 客户端配置
redis_client = get_redis_client(decode_responses=True)
或者类中直接初始化:
from config.database import get_redis_client
def __init__(self):
self.model = RecommendationModel()
self.redis_client = get_redis_client()
后面直接使用即可: