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