当前位置:首页>python>Python面向对象设计——工厂模式

Python面向对象设计——工厂模式

  • 2026-06-29 22:46:09
Python面向对象设计——工厂模式

一、什么是工厂模式?

工厂模式(Factory Pattern) 是一种创建型设计模式,它提供了一种创建对象的方式,而不需要指定具体的类。工厂模式将对象的创建使用分离,通过一个共同的接口来创建对象,使得系统在不修改现有代码的情况下可以扩展新的产品类型。

# 不使用工厂模式
classDog:
defspeak(self):
return"汪汪"

classCat:
defspeak(self):
return"喵喵"

# 客户端代码直接实例化具体类
animal = Dog()
print(animal.speak())

# 使用工厂模式
classAnimalFactory:
defcreate_animal(self, animal_type):
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()

factory = AnimalFactory()
animal = factory.create_animal("dog")
print(animal.speak())

二、为什么需要工厂模式?

2.1 适用场景

  • • 创建逻辑复杂:对象的创建涉及多个步骤或依赖其他对象
  • • 需要解耦:客户端不需要知道具体的产品类
  • • 需要扩展性:新增产品类型时不需要修改客户端代码
  • • 创建条件不确定:根据运行时条件决定创建哪种对象

2.2 优点

  • • 解耦对象创建和使用,降低系统耦合度
  • • 符合开闭原则,扩展新产品不需要修改客户端
  • • 集中管理对象创建逻辑,便于维护
  • • 隐藏复杂的创建细节

2.3 缺点

  • • 增加代码复杂度,需要引入额外的类和接口
  • • 对于简单的对象创建,可能过度设计

三、工厂模式的类型

类型
说明
简单工厂
一个工厂类根据参数返回不同产品(不属于设计模式)
工厂方法
定义创建对象的接口,子类决定实例化哪个类
抽象工厂
创建一系列相关或相互依赖的产品族

四、简单工厂模式

4.1 概念

简单工厂不是正式的设计模式,而是一种编程习惯。它通过一个工厂类根据传入的参数决定创建哪种产品。

from abc import ABC, abstractmethod

# 产品接口
classAnimal(ABC):
    @abstractmethod
defspeak(self):
pass

# 具体产品
classDog(Animal):
defspeak(self):
return"汪汪"

classCat(Animal):
defspeak(self):
return"喵喵"

classBird(Animal):
defspeak(self):
return"叽叽喳喳"

# 简单工厂
classAnimalFactory:
    @staticmethod
defcreate_animal(animal_type: str) -> Animal:
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
elif animal_type == "bird":
return Bird()
else:
raise ValueError(f"未知的动物类型: {animal_type}")

# 使用
factory = AnimalFactory()
animal = factory.create_animal("dog")
print(animal.speak())  # 汪汪

4.2 使用类方法实现简单工厂

classAnimal(ABC):
    @abstractmethod
defspeak(self):
pass

    @classmethod
defcreate(cls, animal_type: str):
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
else:
raise ValueError(f"未知类型: {animal_type}")

classDog(Animal):
defspeak(self):
return"汪汪"

# 使用
animal = Animal.create("dog")
print(animal.speak())

五、工厂方法模式

5.1 概念

工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法让类的实例化延迟到子类中。

from abc import ABC, abstractmethod

# 产品接口
classTransport(ABC):
    @abstractmethod
defdeliver(self):
pass

# 具体产品
classTruck(Transport):
defdeliver(self):
return"陆路运输(卡车)"

classShip(Transport):
defdeliver(self):
return"海上运输(船只)"

classAirplane(Transport):
defdeliver(self):
return"空中运输(飞机)"

# 工厂抽象
classLogistics(ABC):
    @abstractmethod
defcreate_transport(self) -> Transport:
pass

defplan_delivery(self):
        transport = self.create_transport()
return transport.deliver()

# 具体工厂
classRoadLogistics(Logistics):
defcreate_transport(self) -> Transport:
return Truck()

classSeaLogistics(Logistics):
defcreate_transport(self) -> Transport:
return Ship()

classAirLogistics(Logistics):
defcreate_transport(self) -> Transport:
return Airplane()

# 使用
logistics = RoadLogistics()
print(logistics.plan_delivery())  # 陆路运输(卡车)

logistics = SeaLogistics()
print(logistics.plan_delivery())  # 海上运输(船只)

logistics = AirLogistics()
print(logistics.plan_delivery())  # 空中运输(飞机)

六、抽象工厂模式

6.1 概念

抽象工厂模式创建一系列相关或相互依赖的产品族,而不需要指定具体的类。

from abc import ABC, abstractmethod

# 产品接口 - 椅子
classChair(ABC):
    @abstractmethod
defsit_on(self):
pass

# 产品接口 - 桌子
classTable(ABC):
    @abstractmethod
defput_on(self):
pass

# 产品接口 - 沙发
classSofa(ABC):
    @abstractmethod
deflie_on(self):
pass

# 现代风格产品
classModernChair(Chair):
defsit_on(self):
return"坐在现代椅子上"

classModernTable(Table):
defput_on(self):
return"现代桌子"

classModernSofa(Sofa):
deflie_on(self):
return"现代沙发"

# 古典风格产品
classVintageChair(Chair):
defsit_on(self):
return"坐在古典椅子上"

classVintageTable(Table):
defput_on(self):
return"古典桌子"

classVintageSofa(Sofa):
deflie_on(self):
return"古典沙发"

# 抽象工厂
classFurnitureFactory(ABC):
    @abstractmethod
defcreate_chair(self) -> Chair:
pass

    @abstractmethod
defcreate_table(self) -> Table:
pass

    @abstractmethod
defcreate_sofa(self) -> Sofa:
pass

# 现代风格工厂
classModernFurnitureFactory(FurnitureFactory):
defcreate_chair(self) -> Chair:
return ModernChair()

defcreate_table(self) -> Table:
return ModernTable()

defcreate_sofa(self) -> Sofa:
return ModernSofa()

# 古典风格工厂
classVintageFurnitureFactory(FurnitureFactory):
defcreate_chair(self) -> Chair:
return VintageChair()

defcreate_table(self) -> Table:
return VintageTable()

defcreate_sofa(self) -> Sofa:
return VintageSofa()

# 使用
defdecorate_room(factory: FurnitureFactory):
    chair = factory.create_chair()
    table = factory.create_table()
    sofa = factory.create_sofa()

print(chair.sit_on())
print(table.put_on())
print(sofa.lie_on())

print("=== 现代风格房间 ===")
decorate_room(ModernFurnitureFactory())

print("\n=== 古典风格房间 ===")
decorate_room(VintageFurnitureFactory())

七、实战案例

7.1 数据库连接工厂

from abc import ABC, abstractmethod
import sqlite3
import pymysql  # 需要安装
import psycopg2  # 需要安装

# 产品接口
classDatabaseConnection(ABC):
    @abstractmethod
defconnect(self):
pass

    @abstractmethod
defexecute(self, query):
pass

# 具体产品
classSQLiteConnection(DatabaseConnection):
defconnect(self):
self.conn = sqlite3.connect('database.db')
returnself.conn

defexecute(self, query):
        cursor = self.conn.cursor()
        cursor.execute(query)
return cursor.fetchall()

classMySQLConnection(DatabaseConnection):
defconnect(self):
self.conn = pymysql.connect(
            host='localhost',
            user='root',
            password='password',
            database='test'
        )
returnself.conn

defexecute(self, query):
        cursor = self.conn.cursor()
        cursor.execute(query)
return cursor.fetchall()

classPostgreSQLConnection(DatabaseConnection):
defconnect(self):
self.conn = psycopg2.connect(
            host='localhost',
            user='postgres',
            password='password',
            database='test'
        )
returnself.conn

defexecute(self, query):
        cursor = self.conn.cursor()
        cursor.execute(query)
return cursor.fetchall()

# 工厂
classDatabaseFactory:
    @staticmethod
defcreate_connection(db_type: str) -> DatabaseConnection:
if db_type == 'sqlite':
return SQLiteConnection()
elif db_type == 'mysql':
return MySQLConnection()
elif db_type == 'postgres':
return PostgreSQLConnection()
else:
raise ValueError(f"不支持的数据库类型: {db_type}")

# 使用
db = DatabaseFactory.create_connection('sqlite')
db.connect()
# db.execute("SELECT * FROM users")

7.2 文档生成器工厂

from abc import ABC, abstractmethod

# 产品接口
classDocument(ABC):
    @abstractmethod
defcreate_header(self):
pass

    @abstractmethod
defcreate_body(self):
pass

    @abstractmethod
defcreate_footer(self):
pass

# 具体产品
classPDFDocument(Document):
defcreate_header(self):
return"PDF 页眉"

defcreate_body(self):
return"PDF 正文"

defcreate_footer(self):
return"PDF 页脚"

classHTMLDocument(Document):
defcreate_header(self):
return"<header>HTML Header</header>"

defcreate_body(self):
return"<body>HTML Body</body>"

defcreate_footer(self):
return"<footer>HTML Footer</footer>"

classMarkdownDocument(Document):
defcreate_header(self):
return"# Markdown Header"

defcreate_body(self):
return"## Body\n\nContent here"

defcreate_footer(self):
return"*Footer*"

# 工厂
classDocumentFactory:
    @staticmethod
defcreate_document(doc_type: str) -> Document:
if doc_type == 'pdf':
return PDFDocument()
elif doc_type == 'html':
return HTMLDocument()
elif doc_type == 'md':
return MarkdownDocument()
else:
raise ValueError(f"不支持的文档类型: {doc_type}")

defgenerate_report(doc_type: str):
    doc = DocumentFactory.create_document(doc_type)
    content = f"{doc.create_header()}\n{doc.create_body()}\n{doc.create_footer()}"
return content

print("=== PDF 报告 ===")
print(generate_report('pdf'))

print("\n=== HTML 报告 ===")
print(generate_report('html'))

print("\n=== Markdown 报告 ===")
print(generate_report('md'))

7.3 支付网关工厂(工厂方法)

from abc import ABC, abstractmethod

# 产品接口
classPayment(ABC):
    @abstractmethod
defpay(self, amount: float) -> bool:
pass

    @abstractmethod
defrefund(self, amount: float) -> bool:
pass

# 具体产品
classAlipayPayment(Payment):
def__init__(self, app_id: str):
self.app_id = app_id

defpay(self, amount: float) -> bool:
print(f"支付宝支付 {amount} 元")
returnTrue

defrefund(self, amount: float) -> bool:
print(f"支付宝退款 {amount} 元")
returnTrue

classWechatPayment(Payment):
def__init__(self, mch_id: str):
self.mch_id = mch_id

defpay(self, amount: float) -> bool:
print(f"微信支付 {amount} 元")
returnTrue

defrefund(self, amount: float) -> bool:
print(f"微信退款 {amount} 元")
returnTrue

classCreditCardPayment(Payment):
def__init__(self, card_number: str):
self.card_number = card_number

defpay(self, amount: float) -> bool:
print(f"信用卡支付 {amount} 元")
returnTrue

defrefund(self, amount: float) -> bool:
print(f"信用卡退款 {amount} 元")
returnTrue

# 工厂接口
classPaymentFactory(ABC):
    @abstractmethod
defcreate_payment(self) -> Payment:
pass

# 具体工厂
classAlipayFactory(PaymentFactory):
def__init__(self, app_id: str):
self.app_id = app_id

defcreate_payment(self) -> Payment:
return AlipayPayment(self.app_id)

classWechatFactory(PaymentFactory):
def__init__(self, mch_id: str):
self.mch_id = mch_id

defcreate_payment(self) -> Payment:
return WechatPayment(self.mch_id)

classCreditCardFactory(PaymentFactory):
def__init__(self, card_number: str):
self.card_number = card_number

defcreate_payment(self) -> Payment:
return CreditCardPayment(self.card_number)

# 使用
classPaymentProcessor:
def__init__(self, factory: PaymentFactory):
self.factory = factory

defprocess_payment(self, amount: float):
        payment = self.factory.create_payment()
return payment.pay(amount)

# 客户端
alipay_processor = PaymentProcessor(AlipayFactory("app_123456"))
alipay_processor.process_payment(100)

wechat_processor = PaymentProcessor(WechatFactory("mch_123456"))
wechat_processor.process_payment(200)

7.4 配置化工厂(动态注册)

from abc import ABC, abstractmethod
from typing importDictType

# 产品接口
classPlugin(ABC):
    @abstractmethod
defexecute(self, data):
pass

# 具体产品
classDataValidator(Plugin):
defexecute(self, data):
returnf"验证数据: {data}"

classDataTransformer(Plugin):
defexecute(self, data):
returnf"转换数据: {data}"

classDataExporter(Plugin):
defexecute(self, data):
returnf"导出数据: {data}"

# 可扩展工厂(支持动态注册)
classPluginFactory:
    _plugins: Dict[strType[Plugin]] = {}

    @classmethod
defregister(cls, name: str, plugin_class: Type[Plugin]):
        cls._plugins[name] = plugin_class

    @classmethod
defcreate(cls, name: str, **kwargs) -> Plugin:
        plugin_class = cls._plugins.get(name)
ifnot plugin_class:
raise ValueError(f"未知的插件: {name}")
return plugin_class(**kwargs)

    @classmethod
deflist_plugins(cls):
returnlist(cls._plugins.keys())

# 注册插件
PluginFactory.register("validator", DataValidator)
PluginFactory.register("transformer", DataTransformer)
PluginFactory.register("exporter", DataExporter)

# 使用
plugin = PluginFactory.create("validator")
print(plugin.execute("测试数据"))

plugin = PluginFactory.create("transformer")
print(plugin.execute("测试数据"))

print(f"可用插件: {PluginFactory.list_plugins()}")

八、工厂模式对比

模式
复杂度
扩展性
适用场景
简单工厂
低(需修改工厂类)
产品类型少,不易变化
工厂方法
高(新增产品需新增工厂)
产品类型多,需要扩展
抽象工厂
需要创建产品族

九、总结

核心要点

  • • 简单工厂:一个工厂类根据参数创建不同产品,适合产品类型较少的场景。
  • • 工厂方法:定义创建接口,子类决定创建哪种产品,符合开闭原则。
  • • 抽象工厂:创建一系列相关产品族,适合需要统一风格或关联产品的场景。
  • • 优点:解耦创建和使用、符合开闭原则、集中管理创建逻辑。
  • • 缺点:增加代码复杂度,需要引入额外类和接口。

选择建议

  • • 产品类型少且固定 → 简单工厂
  • • 产品类型多且需要扩展 → 工厂方法
  • • 需要创建一系列相关产品 → 抽象工厂

掌握工厂模式,可以帮助你在对象创建逻辑复杂或需要支持扩展时,写出更灵活、更易维护的代码。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-04 05:19:39 HTTP/2.0 GET : https://f.mffb.com.cn/a/491034.html
  2. 运行时间 : 0.134968s [ 吞吐率:7.41req/s ] 内存消耗:4,607.70kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=cbe6f8086817c09dba44315754eaa67c
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000650s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000830s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.012367s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.001486s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000710s ]
  6. SELECT * FROM `set` [ RunTime:0.002459s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000680s ]
  8. SELECT * FROM `article` WHERE `id` = 491034 LIMIT 1 [ RunTime:0.007476s ]
  9. UPDATE `article` SET `lasttime` = 1783113579 WHERE `id` = 491034 [ RunTime:0.007416s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000369s ]
  11. SELECT * FROM `article` WHERE `id` < 491034 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000564s ]
  12. SELECT * FROM `article` WHERE `id` > 491034 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001077s ]
  13. SELECT * FROM `article` WHERE `id` < 491034 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000825s ]
  14. SELECT * FROM `article` WHERE `id` < 491034 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001424s ]
  15. SELECT * FROM `article` WHERE `id` < 491034 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001287s ]
0.136586s