1. 程式人生 > 實用技巧 >java設計模式之 -- 工廠模式

java設計模式之 -- 工廠模式

工廠模式(Factory Pattern)

Java 中最常用的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。

先說下簡單的工廠方法模式

汽車介面

/**
 * 汽車介面
 */
public interface Car{
    String getType();
}

豪華轎車:limousine

/**
* 豪華汽車
*/
public class limousine implements Car{
    private String type = "
豪華汽車"; @Override public String getType() { return type; } }

貨車:truck

/**
* 貨車
*/
public class truckimplements Car{
    private String type = "貨車";
    @Override
    public String getType() {
        return type;
    }
}

車工廠:CarFactory

public class CarFacotry {

    public static
Car creatCar(String type){ switch (type){ case "貨車": return new Truck(); case "豪華汽車": return new Limousine(); default: return null; } } }

測試類

public class Clineter {
    public static void
main(String[] args) { Car car = CarFacotry.creatCar("貨車"); System.out.println(car.getType()); } }

列印結果:

這就是簡單工廠方法,只有一個工廠類來面向多個目標實現。當目標實現增多時,我們不得不去修改工廠類的方法,使其相容新的實現型別,這明顯違背了開閉原則,所以出現了工廠方法模式。

二、工廠模式

汽車介面

public interface Car {
    String getType();
}

豪華轎車:limousine

public class Limousine implements Car {
    private String type = "豪華汽車";

    @Override
    public String getType() {
        return type;
    }
}

貨車:

public class Truck implements Car {
    private String type = "貨車";
    @Override
    public String getType() {
        return type;
    }
}

車的工廠介面:

public interface CarFactory {
//這裡就不用定義是什麼型別的車了,想用什麼型別的車直接呼叫對應型別車的工廠就好 Car creatCar(); }

豪華汽車工廠:

public class LimousineFactory implements CarFactory{
    @Override
    public Car creatCar() {
        return new Limousine();
    }
}

貨車工廠:

public class TruckFactory implements CarFactory{
    @Override
    public Car creatCar() {
        return new Truck();
    }
}

測試類:

public class Clineter {
    public static void main(String[] args) {
//
        CarFactory carFacotry = new  TruckFactory();
        Car car = carFacotry.creatCar();
        System.out.println(car.getType());
    }
}

從上面的例項中可以很容易看出來,工廠方法模式的重點就在這個工廠介面了。

目標可以無限擴充套件,工廠類也要隨之擴充套件,一對一存在,滿足了開閉原則,但如果目標實現較多,工廠實現類也會增多,不簡潔。

MyBatis中使用的比較多,事務模組和資料來源模組都使用了工廠方法模式。

使用場景:1、日誌記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日誌到什麼地方。 2、資料庫訪問,當用戶不知道最後系統採用哪一類資料庫,以及資料庫可能有變化時。 3、設計一個連線伺服器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實現一個介面。

注意事項:作為一種建立類模式,在任何需要生成複雜物件的地方,都可以使用工廠方法模式。有一點需要注意的地方就是複雜物件適合使用工廠模式,而簡單物件,特別是只需要通過 new 就可以完成建立的物件,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度。