設計模式學習筆記---------------------------------------------工廠模式和匿名類

     實現原理:利用多態的特性,將定義和實現徹底分開。

     應用場景:對於某一羣擁有公共接口的類,只用知道類名,就可以得到該類的實例對象。這對於一些複雜的對象,直接通過new創建會比較複雜,而且對於使用者來說沒有必要,還有就是如果修改了創建對象時的參數,使用該類的方法都要進行修改。爲此將對象的定義和實現分開,符合軟件設計的開閉原則,對擴展開放,對修改關閉。

       舉例 馬路上跑着不同的車

       所有的車都有跑這個功能,可以抽象出一個車的接口

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/27 19:09
 * @Description:
 */
public interface Car {
    void run();
}

  注意爲了把接口和實現分開,我們把車的具體實現和定義分開,抽象出一個專門建造車的工廠接口。

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/27 19:11
 * @Description:
 */
public interface CarFactory {
    Car getCar();
}

馬路上可以跑各種各樣的車,

有寶馬車

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/29 10:45
 * @Description:
 */
public class BMWCar implements Car {
    private BMWCar(){};
    public static CarFactory factory = new CarFactory() {
        public Car getCar() {
            return new BMWCar();
        }
    };
    public void run() {
        System.out.println("BMW car is running");
    }
}

有奔馳車

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/29 10:50
 * @Description:
 */
public class BenZCar implements Car {
    private BenZCar(){};
    public void run() {
        System.out.println("BenZCar is running");
    }
    public static CarFactory Factory = new CarFactory() {
        public Car getCar() {
            return new BenZCar();
        }
    };
}

讓不同的車跑起來

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/29 10:52
 * @Description:
 */
public class Run {
    public static void run(CarFactory factory){
        factory.getCar().run();
    }

    public static void main(String[] args) {
        run(BMWCar.factory);
        run(BenZCar.Factory);
    }
}

爲什麼要用匿名類。

沒有必要去使用具名類,這樣更加優雅方便,而且把工廠方法內置到被創建的類中,同樣利用了工廠模式的思想,創建工廠對象的定義和實現都不對外暴露,提高內聚。這一點是參考《JAVA編程思想》中的例子。

參考資料:《JAVA編程思想》

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