工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。工厂模式主要分为简单工厂模式、工厂方法模式以及抽象工厂模式。
Obj.m
classdef Obj < handle
methods
function desc(~)
end
end
end
Object1.m
classdef Object1 < Obj
methods
function desc(~)
disp('This is Object1 class');
end
end
end
Object2.m
classdef Object2 < Obj
methods
function desc(~)
disp('This is Object2 class');
end
end
end
简单工厂模式:
SimpleFactory.m
classdef SimpleFactory
methods
function res = createObject(~,obj_name)
if strcmp(obj_name,'Object1')
res = Object1();
elseif strcmp(obj_name,'Object2')
res = Object2();
else
res = Object.empty();
end
end
function res = createObjectEval(~,obj_name)
res = eval(obj_name);
end
function res = createObjectStr2Func(~,obj_name)
consHandle = str2func(obj_name);
res = consHandle();
end
function res = createObject1(~)
res = Object1();
end
function res = createObject2(~)
res = Object2();
end
end
methods(Static)
function res = createObjectStatic(obj_name)
if strcmp(obj_name,'Object1')
res = Object1();
elseif strcmp(obj_name,'Object2')
res = Object2();
else
res = Object.empty();
end
end
end
end
测试代码testSimpleFactory.m
%简单工厂模式
fac = SimpleFactory();
obj1 = fac.createObject('Object1');
obj1.desc();
obj2 = fac.createObject('Object2');
obj2.desc();
%通过eval函数
fac = SimpleFactory();
obj1 = fac.createObjectEval('Object1');
obj1.desc();
obj2 = fac.createObjectEval('Object2');
obj2.desc();
%通过str2func函数
fac = SimpleFactory();
obj1 = fac.createObjectStr2Func('Object1');
obj1.desc();
obj2 = fac.createObjectStr2Func('Object2');
obj2.desc();
%静态工厂模式
obj1 = SimpleFactory.createObjectStatic('Object1');
obj1.desc();
obj2 = SimpleFactory.createObjectStatic('Object2');
obj2.desc();
%多方法工厂模式
fac = SimpleFactory();
obj1 = fac.createObject1();
obj1.desc();
obj2 = fac.createObject2();
obj2.desc();
结果:
工厂方法模式:
MethodFactory.m
classdef MethodFactory
methods(Abstract)
factoryMethod(~);
end
methods
function dosomething(obj)
disp('This is method factory!')
o = obj.factoryMethod();
o.desc();
end
end
end
MethodFactory1.m
classdef MethodFactory1 < MethodFactory
methods
function res = factoryMethod(~)
res = Object1();
end
end
end
MethodFactory2.m
classdef MethodFactory2 < MethodFactory
methods
function res = factoryMethod(~)
res = Object2();
end
end
end
测试代码testFactoryMethod:
%工厂方法模式
fac1 = MethodFactory1();
fac1.dosomething();
fac2 = MethodFactory2();
fac2.dosomething();
运行结果:
抽象工厂模式:
IFactory.m
classdef IFactory
methods(Abstract)
createObject(~);
end
end
Obj1Factory.m
classdef Obj1Factory < IFactory
methods
function res = createObject(~)
res = Object1();
end
end
end
Obj2Factory.m
classdef Obj2Factory < IFactory
methods
function res = createObject(~)
res = Object2();
end
end
end
测试代码testAbstractFactory.m
fac1 = Obj1Factory();
obj1 = fac1.createObject();
obj1.desc();
fac2 = Obj2Factory();
obj2 = fac2.createObject();
obj2.desc();
运行结果: