軟體設計模式——簡單工廠模式(Simple Factory)
1.工廠模式(靜態工廠模式、工廠方法模式、抽象工廠模式)
(1)引入
話說十年前,有一個暴發戶,他家有三輛汽車——Benz 賓士、Bmw 寶馬、Audi 奧迪,還僱了司機為他開車。不過,暴發戶坐車時總是怪怪的:上 Benz 車後跟司機說“開賓士車!”, 坐上 Bmw 後他說“開寶馬車!”,坐上 Audi 說“開奧迪車!”。你一定說:這人有病!直接說 開車不就行了?!
而當把這個暴發戶的行為放到我們程式設計中來時,會發現這是一個普遍存在的現象。 幸運的是,這種有病的現象在 OO(面向物件)語言中可以避免了。下面就以 Java 語言為 基礎來引入我們本文的主題:工廠模式。
(2)分類
工廠模式主要是為建立物件提供過度介面,以便將建立物件的具體過程遮蔽隔離起來,達到提高靈活性的目的。
工廠模式主要分為三類:
1)簡單工廠模式
2)工廠方法模式
3)抽象工廠模式
這三種模式從上往下逐步抽象。一般情況下,將簡單工廠模式看作工廠方法的一個特例,將兩者歸為一類。
(3)簡單工廠模式
簡單工廠模式又稱為靜態工廠方法模式,主要由三部分組成:
1)工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在java中它往往由 一個具體類實現。
2)抽象產品角色:它一般是具體產品繼承的父類或者實現的介面。在java中由介面或者抽象類來實現。
3)具體產品角色:工廠類所建立的物件就是此角色的例項。在java中由一個具體類實現。
//抽象產品角色
public interface Car {
public void drive();
}
//具體產品角色
public class Bmw implements Car
{
@Override
public void drive() {
System.out.println("Driving Bmw!");
}
}
//具體產品角色
public class Benz implements Car
{
public void drive() {
System.out.println("Driving Benz!");
}
}
.......
//工廠類角色,主要在這裡面建立相應的產品類例項
public class Drive {
public static Car driveCar(String s)throws Exception{
if (s.equalsIgnoreCase("Benz")) {
return new Benz();
}else if(s.equalsIgnoreCase("Bmw")){
return new Bmw();
}else if (s.equalsIgnoreCase("Audi")) {
return new Audi();
}else {
throw new Exception();
}
}
}
//客戶端使用
public class Magnate
{
public static void main (String [] args)
{
try {
Car car=Drive.driveCar("Benz");
car.drive();
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出結果:Driving Benz!
下面從開閉原則(對擴充套件開放;對修改封閉)上來分析簡單工廠模式當用戶想要增加一輛車的時候,只要符合抽象產品制定的合同,那麼只要通知工廠類知道就可以被客 戶使用了。所以對產品部分來說,它是符合開閉原則的;但是從工廠部分分析就知道不符合了,因為每增加一輛車,都要在工廠類中增加相應的業務邏輯或者判斷邏輯,這顯然是違背開閉原則 的。可想而知對於新產品的加入,工廠類是很被動的。因此工廠方法模式應運而生,下一篇將詳細講解工廠方法模式。