引言
在現代智慧農業中,物聯網(IoT)技術被廣泛應用於環境監測與控制。例如,在一個智慧蔬菜大棚中,我們需要部署多種傳感器來實時監控光照、土壤濕度和空氣質量等關鍵參數。而這些傳感器可能採用不同的通信協議,如 Zigbee 或 藍牙 Mesh(Bluetooth Mesh)。
為了確保系統具有良好的擴展性和解耦性,我們可以使用設計模式中的 抽象工廠模式(Abstract Factory Pattern) 來組織不同通信協議下的傳感器產品族。
什麼是抽象工廠模式?
抽象工廠模式是一種創建型設計模式,它提供一個接口用於創建一系列相關或相互依賴的對象,而無需指定它們具體的類。
核心角色
- AbstractFactory(抽象工廠):聲明一組用於創建抽象產品的方法。
- ConcreteFactory(具體工廠):實現抽象工廠接口,負責創建某一產品族的具體產品。
- AbstractProduct(抽象產品):為每類產品定義接口。
- ConcreteProduct(具體產品):實現抽象產品接口,屬於某個產品族。
應用場景分析:智慧大棚傳感器系統
在本例中:
- 產品等級結構(Product Hierarchy):
- 空氣傳感器(
Airsensor) - 光照傳感器(
Lightsensor) - 土壤傳感器(
Soilsensor)
- 產品族(Product Family):
- Zigbee 產品族:
ZigbeeAirsensor,ZigbeeLightsensor,ZigbeeSoilsensor - Mesh 產品族:
MeshAirsensor,MeshLightsensor,MeshSoilsensor
系統通過讀取配置文件(如 XML)動態決定使用哪種通信協議的產品族,從而實現“一套生成、無需兼容”的目標。
類圖結構
src/step2/Airsensor.java
package step2;
/********** Begin *********/
public interface Airsensor{
void Work();
}
/********** End *********/
src/step2/IOTFactory.java
package step2;
/********** Begin *********/
public interface IOTFactory{
Airsensor produceAirsensor();
Lightsensor produceLightsensor();
Soilsensor produceSoilsensor();
}
/********** End *********/
src/step2/Lightsensor.java
package step2;
/********** Begin *********/
public interface Lightsensor{
void Work();
}
/********** End *********/
src/step2/MeshAir.java
package step2;
/********** Begin *********/
public class MeshAir implements Airsensor{
public void Work(){
System.out.println("mesh空氣傳感器正常工作中");
}
}
/********** End *********/
src/step2/MeshFactory.java
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 *********/
src/step2/MeshLight.java
package step2;
/********** Begin *********/
public class MeshLight implements Lightsensor{
public void Work(){
System.out.println("mesh光照傳感器正常工作中");
}
}
/********** End *********/
src/step2/MeshSoil.java
package step2;
/********** Begin *********/
public class MeshSoil implements Soilsensor{
public void Work(){
System.out.println("mesh土壤傳感器正常工作中");
}
}
/********** End *********/
src/step2/Soilsensor.java
package step2;
/********** Begin *********/
public interface Soilsensor{
void Work();
}
/********** End *********/
src/step2/ZigbeeAir.java
package step2;
/********** Begin *********/
public class ZigbeeAir implements Airsensor{
public void Work(){
System.out.println("zigbee空氣傳感器正常工作中");
}
}
/********** End *********/
src/step2/ZigbeeFactory.java
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 *********/
src/step2/ZigbeeLight.java
package step2;
/********** Begin *********/
public class ZigbeeLight implements Lightsensor{
public void Work(){
System.out.println("zigbee光照傳感器正常工作中");
}
}
/********** End *********/
src/step2/ZigbeeSoil.java
package step2;
/********** Begin *********/
public class ZigbeeSoil implements Soilsensor{
public void Work(){
System.out.println("zigbee土壤傳感器正常工作中");
}
}
/********** End *********/
src/step2/Client.java
package step2;
public class Client {
public static void main(String args[])
{
try
{
IOTFactory factory;
Airsensor air;
Lightsensor light;
Soilsensor soil;
factory=(IOTFactory)XMLUtil.getBean();
air=factory.produceAirsensor();
light=factory.produceLightsensor();
soil = factory.produceSoilsensor();
air.Work();
light.Work();
soil.Work();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}