GOF設計模式之“工廠模式”

工廠模式實現了創建者和調用者分離。
工廠模式詳細分類可以有一下三種:
簡單工廠模式
工廠方法模式
抽象工廠模式

  1. 簡單工廠模式創建對象可以直接通過“工廠類”創建說需要的對象。
    一個Car接口和兩個實現類
/**
 * Car接口,帶有一個run方法
 * @author 90948
 */
public interface Car {
    void run();
}

public class Audi implements Car {

    @Override
    public void run() {
        System.out.println("奧迪車");
    }

}
public class BYD implements Car {

    @Override
    public void run() {
        System.out.println("比亞迪車");
    }

}

創建工廠類

/**
 * Car工廠,創建Audi對象和BYD對象
 * @author 90948
 */
public class CarFactory {

    public static Car createCar(String name){
        if("奧迪".equals(name)){
            return new Audi();
        }else if("比亞迪".equals(name)){
            return new BYD();
        }else{
            return null;
        }
    }

}

測試類

public class Test {

    public static void main(String[] args) {
        Car c1 = CarFactory.createCar("奧迪");
        Car c2 = CarFactory.createCar("比亞迪");

        c1.run();
        c2.run();
    }

}
//結果:
//奧迪車
//比亞迪車

簡單工廠模式的缺點:不滿足面向對象的基本原則中的“開閉原則”,即開閉原則規定“軟件中的對象(類,模塊,函數等等)應該對於擴展是開放的,但是對於修改是封閉的。

  1. 工廠方法模式:
    同樣用Car接口和兩個實現類
    不同的是,創建一個CarFactory接口,並且有AudiFactory和BYDFactory實現類。

CarFactory接口

public interface CarFactory {
    Car createCar();
}

實現類:

public class AudiFactory implements CarFactory {

    @Override
    public Car createCar() {
        return new Audi();
    }

}

public class BYDFactory implements CarFactory {

    @Override
    public Car createCar() {
        return new BYD();
    }

}

測試類:

public class Test {

    public static void main(String[] args) {
        Car c1 = new AudiFactory().createCar();
        Car c2 = new BYDFactory().createCar();

        c1.run();
        c2.run();
    }

}
//結果:
//奧迪車
//比亞迪車

優點:符合“開閉原則”。但是使項目的複雜度增加,即擴展是以增加新的類來實現的。

  1. 抽象工廠模式
    用來生產不同產品族的全部產品,比如說:生產高端汽車需要高端的發動機,高端的座椅和高端的輪胎,生產低端的汽車需要低端的發動機,低端的座椅和低端的輪胎。代碼實現:
    發動機接口以及其高低端發動機實現類:
/**
 * 發動機接口
 * @author 90948
 *
 */
public interface Engine {
    void run();//轉速
    void strat();//啓動效率
}
/**
 * 高端發動機
 * @author 90948
 *
 */
public class LuxuryEngine implements Engine {

    @Override
    public void run() {
        System.out.println("轉速快!");
    }

    @Override
    public void strat() {
        System.out.println("啓動快!");
    }

}
/**
 * 低端發動機
 * @author 90948
 */
public class LowerEngine implements Engine {

    @Override
    public void run() {
        System.out.println("轉速慢!");
    }

    @Override
    public void strat() {
        System.out.println("啓動慢!");
    }

}

座椅接口以及高低端座椅實現類

/**
 * 座椅接口
 * @author 90948
 */
public interface Seat {
    void massage();//是否可以按摩
}
/**
 * 高端座椅
 * @author 90948
 */
public class LuxurySeat implements Seat {

    @Override
    public void massage() {
        System.out.println("高端座椅,可以按摩!");
    }

}
/**
 * 低端座椅
 * @author 90948
 */
public class LowerSeat implements Seat {

    @Override
    public void massage() {
        System.out.println("低端座椅,不可以按摩!");
    }

}

輪胎接口以及高低端輪胎實現類

/**
 * 輪胎接口
 * @author 90948
 */
public interface Tyre {
    void revolve();//是否磨損
}
/**
 * 高端輪胎
 * @author 90948
 *
 */
public class LuxuryTyre implements Tyre {

    @Override
    public void revolve() {
        System.out.println("高端輪胎,不磨損!");
    }

}
/**
 * 低端輪胎
 * @author 90948
 *
 */
public class LowerTyre implements Tyre {

    @Override
    public void revolve() {
        System.out.println("低端輪胎,質量差!");
    }

}

製造汽車的工廠接口以及高低端汽車生產的實現類

/**
 * 創建汽車的接口
 * @author 90948
 *
 */
public interface CarFactory {
    Engine createEngine();//創建發動機
    Seat createSeat();//創建座椅
    Tyre createTyre();//創建輪胎
}
/**
 * 製作高端汽車
 * @author 90948
 *
 */
public class LuxuryCar implements CarFactory{

    @Override
    public Engine createEngine() {
        return new LuxuryEngine();
    }

    @Override
    public Seat createSeat() {
        return new LuxurySeat();
    }

    @Override
    public Tyre createTyre() {
        return new LuxuryTyre();
    }

}
/**
 * 製作低端汽車
 * @author 90948
 *
 */
public class LowerCar implements CarFactory{

    @Override
    public Engine createEngine() {
        return new LowerEngine();
    }

    @Override
    public Seat createSeat() {
        return new LowerSeat();
    }

    @Override
    public Tyre createTyre() {
        return new LowerTyre();
    }

}

測試類,生產一輛高端汽車:

/**
 * 測試類,製作一輛高端汽車
 * @author 90948
 */
public class Test {

    public static void main(String[] args) {
        CarFactory factory = new LuxuryCar();
        Engine engine = factory.createEngine();
        Seat seat = factory.createSeat();
        Tyre tyre = factory.createTyre();

        engine.run();
        engine.strat();
        seat.massage();
        tyre.revolve();
    }

}
//結果:
//轉速快!
//啓動快!
//高端座椅,可以按摩!
//高端輪胎,不磨損!

應用的場景主要有:
1. JDBC中Connection對象的獲取。
2. Hibernate中通過SessionFactory創建Session
3. Spring中IoC容器創建管理Bean。
等等……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章