关于可扩展性,您可以在工厂中使用containers.Map 对象作为哈希表。下面是一个简单的例子:
classdef SensorFactory < handle
% Lifetime
methods
function [factory] = SensorFactory()
% Creates the factory
% Call super class
factory = factory@handle();
% Pre-register some well-known sensors if you want
factory.RegisterSensor('Sensor A', @() error('TODO: Here of course use appropriate method to create sensor A'));
factory.RegisterSensor('Sensor B', @() error('TODO: Here of course use appropriate method to create sensor B'));
factory.RegisterSensor('Sensor C', @() error('TODO: Here of course use appropriate method to create sensor C'));
end
end
methods
function [] = RegisterSensor(factory, sensorName, createSensorCallback)
% Adds new sensor to the factory
factory.dictionnary(sensorName) = createSensorCallback;
end
function [sensorList] = GetListOfSensors(factory)
% Obtains the list of available sensors
sensorList = factory.dictionnary.keys;
end
function [sensor] = CreateSensor(factory, sensorName)
% Creates sensor instance
createCallback = factory.dictionnary(sensorName);
sensor = createCallback();
end
end
properties(GetAccess = private)
dictionnary = containers.Map(); % Hash table
end
end
这个类可以这样使用:
在代码开头创建工厂:
factory = SensorFactory();
在一些初始化部分动态添加新的传感器:
factory.RegisterSensor('Custom Sensor', @() createCustomSensor());
factory.RegisterSensor('Specific Sensor aperture=42', @() createSpeficSensor(42));
factory.RegisterSensor('Specific Sensor aperture=666', @() createSpecificSensor(666));
注意:出于自动化目的,这也可以通过解析某个文件夹中的类文件来完成。每个类都有一个静态方法来获取传感器的用户名。这里只是一些想法和伪代码:
classdef MySuperSensor
methods(Static)
funcion [name] = GetUserName()
name = 'My super sensor';
end
end
end
---
l = dir('.\sensors');
foreach file in l
try
meta = eval(sprintf('?%s', l.name));
factory.Register(...GetUserName()..., ...CreateCallback...)
catch
end
end
然后,在某个 GUI 部分,添加一个组合,列出迄今为止所有可用的传感器:
set(myCombo, 'String', factory.GetListOfSensors());
最后,在运行部分,实例化合适的传感器:
index = get(myCombo, 'Value');
name = factory.GetListOfSensors();
name = name{index};
sensor = factory.CreateSensor(name);