引言

在現代智慧農業中,物聯網(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)動態決定使用哪種通信協議的產品族,從而實現“一套生成、無需兼容”的目標。


類圖結構

智慧農業大棚物聯網解決方案_java


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());
        }
    }
}