1.使用場景
1)子類過多,不容易管理;構造對象過程過長;精簡代碼創建;
2)目前我們代碼情況: 編寫代碼的時候,我們經常都在new對象,創建一個個的對象,而且還有很多麻煩的創建方式,eg:HashMap<String,Float> grade=new HashMap<String,Float>(),這樣的代碼創建方式太冗長了,難道你沒有想過把這個創建變的短一點么,比如:HashMap<String,Float>grade=HashMapFactory.new(),可以把你創建精簡一點;你也可以還有別的需求,在創建對象的時候,你需要不同的情況,創建統一種類別的對象,eg:我想生成不同的汽車,創建小轎車,創建卡車,創建公交汽車等等,都屬于同種類別:汽車,你難道沒有想過,我把這些創建的對象在一個工廠里來負責創建,我把創建分開化,交給一人來負責,這樣可以讓代碼更加容易管理,創建方式也可以簡單點。
比如:Car BMW=CarFactory.create(bmw); 把創建new由一個統一負責,這樣管理起來相當方便
3)怎么改進:這個時候,你會想到,創建這樣同類別的東西,我把這個權利分出去,讓一個人來單獨管理,它只負責創建我的對象這個事情,所以你單獨簡歷一個對象來創建同類的對象,這個時候,你想這個東西有點像工廠一樣,生成同樣的產品,所以取了個名字:工廠模式,顧名思義,只負責對象的創建
4)改進后的好處:代碼更加容易管理了,代碼的創建要簡潔很多。
5)改進后的壞處:那就是你需要單獨加一個工廠對象來負責創建,多需要寫點代碼。
2.一個實際的例子
創建寶馬汽車與奔馳汽車的例子
1)先提取出一個汽車的公用接口Car
public interface Car{
/**行駛*/
public void drive();
}
2)寶馬和奔馳汽車對象
public class BMWCar implements Car {
/**
* 汽車發動
*/
public void drive(){
System.out.println("BMW Car drive");
}
}
public class BengCar implements Car {
/**
* 汽車發動
*/
public void drive(){
System.out.println("BengChi Care drive");
}
}
3)單獨一個汽車工廠來負責創建
public class FactoryCar {
/**
* 制造汽車
*
* @param company 汽車公司
* @return 汽車
* @throws CreateCarException 制造汽車失敗異常
*/
public static Car createCar(Company company)throws CreateCarException{
if(company==Company.BMW){
return new BMWCar();
}else if(company==Company.Beng){
return new BengCar();
}
return null;
}
}
4)最后的代碼實現:
Car BMWCar=FactoryCar.createCar(Company.BMW);
BMWCar.drive();