實現原理:利用多態的特性,將定義和實現徹底分開。
應用場景:對於某一羣擁有公共接口的類,只用知道類名,就可以得到該類的實例對象。這對於一些複雜的對象,直接通過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編程思想》