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

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

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

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

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

回到正题。作为实际业务高度抽象的的结果,在标准逻辑下存在 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 删除factory接口设计模式数据数据处理

发布者:admin,转转请注明出处:http://www.yc00.com/web/1747565437a4655061.html

相关推荐

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

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

    3小时前
    10

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信