简单工厂模式
1、概述
简单工厂模式属于创建型模式,由一个工厂对象决定创建哪一种产品类的实例,用户在使用时,只需要知道传入工厂对象的参数,而无需关心创建产品类对象的逻辑。
2、结构图**
3、cache代码实现实例
运算类
创建一个抽象方法GetResult,让计算类继承运算类,重写这个方法,进而实现相应的功能
Class com.dd.SimpleFactory.Operation Extends %RegisteredObject
{
Property numberA As %Decimal [ InitialExpression = 0, Private ];
Property numberB As %Decimal [ InitialExpression = 0, Private ];
Method numberAGet() As %String [ ServerOnly = 1 ]
{
Quit i%numberA
}
Method numberASet(Arg As %String) As %Status [ ServerOnly = 1 ]
{
s i%numberA = Arg
Quit $$$OK
}
Method numberBGet() As %String [ ServerOnly = 1 ]
{
Quit i%numberB
}
Method numberBSet(Arg As %String) As %Status [ ServerOnly = 1 ]
{
s i%numberB = Arg
Quit $$$OK
}
Method GetResult() [ Abstract ]
{
s result = 0
q result
}
}
加法类
Class com.dd.SimpleFactory.OperationAdd Extends com.dd.SimpleFactory.Operation
{
Method GetResult()
{
s reulst = 0
s reulst = ..numberAGet() + ..numberBGet()
q reulst
}
}
减法类
Class com.dd.SimpleFactory.OperationSub Extends com.dd.SimpleFactory.Operation
{
Method GetResult()
{
s reulst = 0
s reulst = ..numberAGet()-..numberBGet()
q reulst
}
}
乘法类
Class com.dd.SimpleFactory.OperationMul Extends com.dd.SimpleFactory.Operation
{
Method GetResult()
{
s reulst = 0
s reulst = ..numberAGet() * ..numberBGet()
q reulst
}
}
除法类
Class com.dd.SimpleFactory.OperationDiv Extends com.dd.SimpleFactory.Operation
{
Method GetResult()
{
s reulst = 0
q:..numberBGet()=0 "除数不能为0。"
s reulst = ..numberAGet() / ..numberBGet()
q reulst
}
}
工厂类
Class com.dd.SimpleFactory.OperationFactory Extends %RegisteredObject
{
/// w ##class(com.dd.SimpleFactory.OperationFactory)
ClassMethod CreateOperate(operate As %String) As Operation
{
# dim oper as PHA.YX.Design.SimpleFactory.Operation
s oper = $case(operate,
"+" : ##class(com.dd.SimpleFactory.OperationAdd).%New(),
"‐" : ##class(com.dd.SimpleFactory.OperationSub).%New(),
"*" : ##class(com.dd.SimpleFactory.OperationMul).%New(),
"/" : ##class(com.dd.SimpleFactory.OperationDiv).%New())
q oper
}
}
测试类
Class com.dd.SimpleFactory.FactoryText Extends %RegisteredObject
{
/// w ##class(com.dd.SimpleFactory.FactoryText).SimpleFactory()
ClassMethod SimpleFactory()
{
READ "输入第一个数字:", numberA,!
READ "输入操作符:", operate,!
READ "输入第二个数字:", numberB,!
# dim oper as com.dd.SimpleFactory.Operation
s oper = ##class(com.dd.SimpleFactory.OperationFactory).CreateOperate(operate)
d oper.numberASet(numberA)
d oper.numberBSet(numberB)
s result = oper.GetResult()
q result
}
}
总结:
优点:1、用户使用工厂类,通过传入不同的参数,工厂类将会创建不同的实例类而实现相应的功能,避免了直接实例化 类,降低了耦合性。
2、用户不需要清楚子类的实现细节,如果不使用简单工厂,用户直接使用子类,子类发生变化,用户也得变。
缺点:1、增加新类型,需要修改工厂,违背了开放封闭原则。
2、子类过多,不适合使用。