一、什么是工厂方法(Factory Method)?
工厂方法是一种创建对象的设计模式,它把“创建对象的逻辑”封装在一个方法里,而不是每次都用 __init__ 去手动创建。
我们可以把它理解为:
你不需要关心对象怎么造,只需要告诉我你要什么,我来生产一个给你。
二、为什么要用工厂方法?
直接使用 __init__ 方法来创建对象虽然简单,但当对象的创建逻辑复杂或需要根据不同条件分支时,就会显得冗余和混乱。使用工厂方法可以带来以下好处:
a.封装对象创建逻辑,让主流程更清晰
b.统一创建入口,便于维护和扩展
c.替代繁杂的 if-else,避免逻辑分散
d.方便在项目中复用、测试和重构
三、什么是@classmethod?
@classmethod 是一种类方法修饰符,它的第一个参数是 cls,用于操作类本身。我们经常用它来实现“工厂方法”,将不同对象的创建逻辑封装成类方法。可以在不创建实例的情况下调用。
在实际开发中,@classmethod 常被用来实现工厂方法模式(Factory Method Pattern)
根据不同的参数或上下文,创建并返回不同配置的类实例。
四、工厂方法的使用示例
场景:权限系统中的用户创建
项目中有三种用户类型:普通用户(user)、管理员(admin)、游客(guest)
我们需要根据用户身份创建对应的对象,并初始化不同的权限。
代码示例
step1.定义 User 类和工厂方法
class User:
def __init__(self, name, role, permissions):
self.name = name
self.role = role
self.permissions = permissions
@classmethod
def create_admin(cls, name):
return cls(name, "admin", ["read", "write", "delete"])
@classmethod
def create_user(cls, name):
return cls(name, "user", ["read", "write"])
@classmethod
def create_guest(cls, name):
return cls(name, "guest", ["read"])
user_factory_map = {
"admin": User.create_admin,
"user": User.create_user,
"guest": User.create_guest,
}
step2.用 Flask 实现接口
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/register', methods=['POST'])
def register():
data = request.get_json()
name = data.get("name")
role = data.get("role")
if not name or not role:
return jsonify({"error": "name and role are required"}), 400
# 直接通过工厂映射获取创建方法
create_func = user_factory_map.get(role)
if not create_func:
return jsonify({"error": "invalid role"}), 400
user = create_func(name)
return jsonify({
"name": user.name,
"role": user.role,
"permissions": user.permissions
})
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000, debug=True)
请求示例
payload = {
"name": "APPLE",
"role": "admin"
}