如何永久保存微信聊天记录?这个开源工具让你轻松导出完整对话历史
2026/5/16 15:52:05
工厂模式的核心价值是解耦对象创建与使用,避免new关键字散落在业务逻辑中。
// 用户注册时发送通知if($user->type==='email'){$notifier=newEmailNotifier();// 散落在各处的 new}elseif($user->type==='sms'){$notifier=newSmsNotifier();}$notifier->send('Welcome!');// 工厂封装创建逻辑$notifier=NotifierFactory::create($user->type);$notifier->send('Welcome!');// 业务代码不再关心如何创建💡核心认知:
工厂 = 对象创建的“中央调度室”
// 产品接口interfaceNotifier{publicfunctionsend(string$message);}// 具体产品classEmailNotifierimplementsNotifier{publicfunctionsend(string$message){echo"📧 邮件发送:$message\n";}}classSmsNotifierimplementsNotifier{publicfunctionsend(string$message){echo"📱 短信发送:$message\n";}}// 简单工厂classNotifierFactory{publicstaticfunctioncreate(string$type):Notifier{returnmatch($type){'email'=>newEmailNotifier(),'sms'=>newSmsNotifier(),default=>thrownewInvalidArgumentException("不支持的通知类型:$type")};}}// 使用$notifier=NotifierFactory::create('email');$notifier->send('Hello');// 抽象工厂abstractclassNotifierFactory{abstractpublicfunctioncreateNotifier():Notifier;}// 具体工厂classEmailFactoryextendsNotifierFactory{publicfunctioncreateNotifier():Notifier{returnnewEmailNotifier();}}classSmsFactoryextendsNotifierFactory{publicfunctioncreateNotifier():Notifier{returnnewSmsNotifier();}}// 使用$factory=newEmailFactory();$notifier=$factory->createNotifier();$notifier->send('Hello');// 抽象产品族interfaceButton{publicfunctionrender();}interfaceCheckbox{publicfunctionrender();}// Windows 产品族classWinButtonimplementsButton{publicfunctionrender(){echo"Windows 按钮\n";}}classWinCheckboximplementsCheckbox{publicfunctionrender(){echo"Windows 复选框\n";}}// Mac 产品族classMacButtonimplementsButton{publicfunctionrender(){echo"Mac 按钮\n";}}classMacCheckboximplementsCheckbox{publicfunctionrender(){echo"Mac 复选框\n";}}// 抽象工厂abstractclassGUIFactory{abstractpublicfunctioncreateButton():Button;abstractpublicfunctioncreateCheckbox():Checkbox;}// 具体工厂classWinFactoryextendsGUIFactory{publicfunctioncreateButton():Button{returnnewWinButton();}publicfunctioncreateCheckbox():Checkbox{returnnewWinCheckbox();}}classMacFactoryextendsGUIFactory{publicfunctioncreateButton():Button{returnnewMacButton();}publicfunctioncreateCheckbox():Checkbox{returnnewMacCheckbox();}}// 使用$factory=newMacFactory();$factory->createButton()->render();$factory->createCheckbox()->render();| 模式 | 结构图 | 适用场景 | 扩展性 |
|---|---|---|---|
| 简单工厂 | 调用方 → 工厂 → 产品 | 小型项目,产品类型固定 | ❌ 修改工厂类 |
| 工厂方法 | 调用方 → 具体工厂 → 产品 | 每种产品需独立创建逻辑 | ✅ 新增具体工厂 |
| 抽象工厂 | 调用方 → 产品族工厂 → 多产品 | 多维度产品族(如 UI 主题) | ✅ 新增产品族 |
new User())// 绑定接口到实现app()->bind(Notifier::class,EmailNotifier::class);// 自动解析依赖$notifier=app(Notifier::class);// 相当于工厂Mail::to($user)->send(newWelcomeMail());// 内部使用工厂模式| 陷阱 | 破局方案 |
|---|---|
| 工厂臃肿 | 按业务域拆分工厂(如UserFactory,OrderFactory) |
| 忽略依赖注入 | 工厂应接受依赖(如new NotifierFactory($config)) |
| 过度抽象 | 优先用简单工厂,再按需升级到工厂方法 |
**“工厂不是模式,
而是创建的契约——
- 当你简单工厂,
你在集中创建;- 当你工厂方法,
你在分离责任;- 当你抽象工厂,
你在组合产品族。真正的工程能力,
始于对耦合的敬畏,
成于对细节的精控。”
从今天起:
因为最好的设计模式,
不是生搬硬套,
而是精准匹配业务需求。