工廠模式的實(shí)現(xiàn)可以歸納為以下四種:
1.public class CarFactory{
public static Car getCar(int type){
if(type == 1){
return new Car1();
} else {
return new Car2();
}
}
}
2. public class CarFactory{
public static Car getCar(String carClass){
String className = carClass;
Class c = Class.forName(className);
Car car = (Car)c.newInstance();
return car;
}
}
3. public class CarFactory{
public static Car getCar(String carJNDIName){
InitialContext ic = new InitialContext();
String className = ic.lookUp(carJNDIName);
Car car = (Car)Class.forName(className).newInstance();
return car;
}
}
4. public abstract class AbstractFactory{
public abstract Car getCar(String carClass);
public abstract Plane getPlane(String planeClass);
}
public class Factory1 extends AbstractFactory{
public Car getCar(String carClass){
// 參考上面的方式1~3
return car1;
}
public Plane getPlane(String planeClass){
// 參考上面的方式1~3
return plane1;
}
}
public class Factory2 extends AbstractFactory{
public Car getCar(String carClass){
// 參考上面的方式1~3
return car2;
}
public Plane getPlane(String planeClass){
// 參考上面的方式1~3
return plane2;
}
}
從上面的4種方式來看,方式1~3適合于工廠所產(chǎn)生的對(duì)象都是屬于同一個(gè)父類型的,而方式4則適合于工廠需要產(chǎn)生多種類型的產(chǎn)品,而每一種類型的產(chǎn)品下面又有多個(gè)子類型的情況。
而從方式1~3來看,方式1無疑是最簡單的,也是最容易理解和接受的,而方式2和方式3則相對(duì)來說要高級(jí)一點(diǎn)。高級(jí)在哪里呢?我們可以看到,方式1中對(duì)對(duì)象的創(chuàng)建是使用Hardcode的形式,也即是程序員需要事先知道系統(tǒng)里面存在多少個(gè)類型的對(duì)象及其對(duì)應(yīng)的編號(hào),一旦增加或刪除、修改了對(duì)象的類型,則必然引起if-else塊的改變,造成了維護(hù)的困難。
而方式2則采用了動(dòng)態(tài)類加載的方式,方式3在方式2的基礎(chǔ)上使用了JNDI,更進(jìn)了一步,其好處是不用出現(xiàn)HardCode的方式,即便你后面的應(yīng)用增加、刪除了對(duì)象的類型,我的程序還是保持現(xiàn)在的樣子,跟進(jìn)一步來說:可以去掉那些討厭的if-else語句。
方式4是最為復(fù)雜而且也是最為強(qiáng)大的一種,它在實(shí)現(xiàn)了對(duì)象工廠抽象的基礎(chǔ)上,又集成了工廠方法。使到不同的工廠可以生產(chǎn)相同類型的產(chǎn)品,但產(chǎn)品的子類可能有所不同。就像上面的工廠1和工廠2都可以生產(chǎn)汽車和飛機(jī)一樣,他們各自之間可以生產(chǎn)不同系列的產(chǎn)品(抽象工廠),而且每個(gè)系列下面可能有不同的型號(hào)(工廠方法)。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。