任务描述
本关任务:一个智慧蔬菜大棚需要光照、土壤和空气传感器来搭建物联网,联网方式有 zigbee 或蓝牙 mesh 两种之一。相同联网方式的传感器构成一个产品族,而相同类型的传感器构成了一个产品等级结构,现使用抽象工厂模式模拟该场景,程序将会自动从配置文件中读取联网方式,系统能全套生成,不需要考虑兼容性问题,请根据以下类图来修补文件中的代码。
相关知识
为了完成本关任务,你需要掌握:
- 抽象工厂模式包含的角色;
- 实现方法;
- 抽象工厂模式缺点。
抽象工厂模式包含的角色
- AbstractFactory:抽象工厂
- ConcreteFactory:具体工厂
- AbstractProduct:抽象产品
- ConcreteProduct:具体产品
实现方法
- 以不同的产品类型与产品变体为维度绘制矩阵。
- 为所有产品声明抽象产品接口。 然后让所有具体产品类实现这些接口。
- 声明抽象工厂接口, 并且在接口中为所有抽象产品提供一组构建方法。
- 为每种产品变体实现一个具体工厂类。
- 在应用程序中开发初始化代码。 该代码根据应用程序配置或当前环境, 对特定具体工厂类进行初始化。 然后将该工厂对象传递给所有需要创建产品的类。
- 找出代码中所有对产品构造函数的直接调用, 将其替换为对工厂对象中相应构建方法的调用。
抽象工厂模式缺点
增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则。
编程要求
除“Client”文件中代码不需要修改,其它文件请在右侧编辑器 Begin-End 内补充代码来设计实现。
评测说明
平台会对你编写的代码进行测试:
测试输入:从已有的 XML 文件中读取类的名称;例如 MeshFactory
预期输出: mesh空气传感器正常工作中
mesh光照传感器正常工作中
mesh土壤传感器正常工作中
测试输入:从已有的 XML 文件中读取设备类的名称;例如 ZigbeeFactory
预期输出: zigbee空气传感器正常工作中
zigbee光照传感器正常工作中
zigbee土壤传感器正常工作中
package step2;
/********** Begin *********/
public interface Airsensor
{
public void Work();
}
/********** End *********/
package step2;
/********** Begin *********/
public interface IOTFactory
{
public Airsensor produceAirsensor();
public Lightsensor produceLightsensor();
public Soilsensor produceSoilsensor();
}
/********** End *********/
package step2;
/********** Begin *********/
public interface Lightsensor
{
public void Work();
}
/********** End *********/
package step2;
/********** Begin *********/
public class MeshAir implements Airsensor
{
public void Work()
{
System.out.println("mesh空气传感器正常工作中");
}
}
/********** End *********/
package step2;
/********** Begin *********/
public class MeshFactory implements IOTFactory
{
public Airsensor produceAirsensor()
{
return new MeshAir();
}
public Lightsensor produceLightsensor()
{
return new MeshLight();
}
public Soilsensor produceSoilsensor()
{
return new MeshSoil();
}
}
/********** End *********/
package step2;
/********** Begin *********/
public class MeshLight implements Lightsensor
{
public void Work()
{
System.out.println("mesh光照传感器正常工作中");
}
}
/********** End *********/
package step2;
/********** Begin *********/
public class MeshSoil implements Soilsensor
{
public void Work()
{
System.out.println("mesh土壤传感器正常工作中");
}
}
/********** End *********/
package step2;
/********** Begin *********/
public interface Soilsensor
{
public void Work();
}
/********** End *********/
package step2;
/********** Begin *********/
public class ZigbeeAir implements Airsensor
{
public void Work()
{
System.out.println("zigbee空气传感器正常工作中");
}
}
/********** End *********/
package step2;
/********** Begin *********/
public class ZigbeeFactory implements IOTFactory
{
public Airsensor produceAirsensor()
{
return new ZigbeeAir();
}
public Lightsensor produceLightsensor()
{
return new ZigbeeLight();
}
public Soilsensor produceSoilsensor()
{
return new ZigbeeSoil();
}
}
/********** End *********/
package step2;
/********** Begin *********/
public class ZigbeeLight implements Lightsensor
{
public void Work()
{
System.out.println("zigbee光照传感器正常工作中");
}
}
/********** End *********/
package step2;
/********** Begin *********/
public class ZigbeeSoil implements Soilsensor
{
public void Work()
{
System.out.println("zigbee土壤传感器正常工作中");
}
}
/********** End *********/
package step3;
public class Client {
public static void main(String args[])
{
try
{
TV tv;
TVFactory factory;
factory=(TVFactory)XMLUtil.getBean();
tv=factory.produceTV();
tv.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}