首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式:工厂方法模式(Factory Method)(2)

设计模式:工厂方法模式(Factory Method)(2)

作者头像
firstxinjie
发布2025-04-23 10:30:28
发布2025-04-23 10:30:28
10000
代码可运行
举报
文章被收录于专栏:X#(XSharp)X#(XSharp)
运行总次数:0
代码可运行

当年做一个项目时,还不懂什么是设计模式,仅仅是按照经验完成了需求。回头看看,就是暗合桥接模式。但是,在整个需求实现过程中,甲方需要我在已经设计好的标准业务逻辑中添加非标的需求,因为,在他们眼里,从业务角度来看,是自然的拓展。

如果当年我知道还有这样一种设计模式,或许,成品会更优秀。

回到正题。作为实际业务高度抽象的的结果,在标准逻辑下存在 UI_A 类和 Data_A类,它们的代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
Public loForm as UI_A
m.loForm = CreateObject("", CreateObject("Data_A"))
m.loForm.Show()

*** <summary>
*** 标准逻辑下的 UI
*** </summary>
Define Class UI_A As myForm
	oDE = .Null.

	Procedure Init(toDE As Custom)
		This.oDE = m.toDE
	Endproc

	Procedure Operation()
		This.oData.Operation()
	Endproc
Enddefine

*** <summary>
*** 标准逻辑下的数据处理
*** </summary>
Define Class Data_A As myDE
	*** <summary>
	*** 代表标准逻辑的数据操作方法
	*** </summary>
	Procedure Operation()
		*!* 这里是标准逻辑下的数据处理
	Endproc
Enddefine

按照标准的桥接模式的设计要素,那么,这里仅仅缺少"约束"类的“接口”。但是按照 VFP 的特性,"接口"存在与否的重要性,远不如开发者遵循“接口”的自觉性重要。

当时的处理方式,仅仅使用了所谓的CV大法:

代码语言:javascript
代码运行次数:0
运行
复制
Public loForm as UI_B
m.loForm = CreateObject("", CreateObject("Data_B"))
m.loForm.Show()

*** <summary>
*** 非标准逻辑下的 UI
*** </summary>
Define Class UI_B As myForm
	oDE = .Null.

	Procedure Init(toDE As Custom)
		This.oDE = m.toDE
	Endproc

	Procedure Operation()
		This.oData.Operation()
	Endproc
Enddefine

*** <summary>
*** 非标准逻辑下的数据处理
*** </summary>
Define Class Data_B As myDE
	*** <summary>
	*** 代表非标准逻辑的数据操作方法
	*** </summary>
	Procedure Operation()
		*!* 这里是非标准逻辑下的数据处理
	Endproc
Enddefine

如果当时知道工厂方法模式,也许有更完美的设计:

代码语言:javascript
代码运行次数:0
运行
复制
Public loForm As UI
m.loForm = CreateObject("UI")
m.loForm.Show()

*** <summary>
*** 模拟抽象类
*** </summary>
Define Class AbstractionUI As myForm
	oDE = .Null.

	*** <summary>
	*** 充当抽象方法的声明,子类必须实现该方法
	*** </summary>
	Procedure Init()
	EndProc 

	*** <summary>
	*** 模板方法 - 调用具体数据处理逻辑
	*** </summary>
	Procedure Operation()
		This.oDE.Operation()
	EndProc 
EndDefine 

*** <summary>
*** 具体的 UI
*** </summary>
Define Class UI As AbstractionUI
	*** <summary>
	*** 工厂方法的实现
	*** </summary>
	Procedure Init()
		If 条件 = 标准逻辑
			This.oDE = This.CreateDE("A")
		Else 
			This.oDE = This.CreateDE("B")
		EndIf 
	EndProc

	*** <summary>
	*** 工厂方法的封装,可扩展
	*** </summary>
	*** <param name="cType"></param>
	Procedure CreateDE(cType As String)
		Return CreateObject("Data_" + cType)
	EndProc 
Enddefine

*** <summary>
*** 标准逻辑下的数据处理
*** </summary>
Define Class Data_A As myDE
	*** <summary>
	*** 代表标准逻辑的数据操作方法
	*** </summary>
	Procedure Operation()
		*!* 这里是标准逻辑下的数据处理
	Endproc
EndDefine

*** <summary>
*** 非标准逻辑下的数据处理
*** </summary>
Define Class Data_B As myDE
	*** <summary>
	*** 代表非标准逻辑的数据操作方法
	*** </summary>
	Procedure Operation()
		*!* 这里是非标准逻辑下的数据处理
	Endproc
Enddefine

这样,仅需增加一个模块参数,就可以在同一可执行文件中随时在标准和非标之间进行切换而无需对项目进行重新编译。

PS. myDE 类可以认为是一个接口(类模板)

这个代码融合了工厂方法模式和桥接模式的本质,应该是最佳方案。

未完待续......

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 xinjie的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档