靜態工廠模式
引言
追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,只管向服務員說“來四個雞翅”就行了。麥當勞和肯德基就是生產雞翅的Factory 工廠模式:客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何建立及如何向客戶端提供。
正文
工廠模式是我們最常見的例項化物件的模式了,它可以使開發者在例項化物件的時候省去**new()**這一步,需要什麼類的例項就可以去建立一個。工廠模式屬於建立型模式之一。
應用例項
我想吃一個水果,直接去工廠裡去拿即可,二不用管這個水果是從哪裡種的,以及是如何澆水施肥的,只需要告訴工廠你是想吃蘋果還是梨子即可。
具體步驟
步驟1
建立一個水果的抽象類:
public abstract class Fruit {
public abstract void eat();
}
複製程式碼
步驟2
建立繼承抽象類的實體類:
蘋果類:
public class Apple extends Fruit {
@Override
public void eat() {
System.out.println("I wanna an apple");
}
}
複製程式碼
香蕉類:
public class Banana extends Fruit {
@Override
public void eat() {
System.out.println("I wanna a banana");
}
}
複製程式碼
梨子類:
public class Pear extends Fruit {
@Override
public void eat() {
System.out.println("吃一個梨");
}
}
複製程式碼
步驟3
建立一個工廠,使其可以根據傳遞過來的引數來例項化相應的物件。
public class FruitFactory {
public static Fruit createFruit(String type) {
Fruit mFruit = null;
switch (type) {
case "Apple":
mFruit = new Apple();
break;
case "Banana":
mFruit = new Banana();
break;
case "Pear":
mFruit = new Pear();
break;
default:
break;
}
return mFruit;
}
}
複製程式碼
步驟4
使用者使用該工廠:
public class EatFruit {
public static void main(String[] args) {
// TODO Auto-generated method stub
FruitFactory.createFruit("Apple").eat();
FruitFactory.createFruit("Banana").eat();
FruitFactory.createFruit("Pear").eat();
}
}
複製程式碼
總結
使用場景
所需要建立的類的數量不是很多的場景下,可以考慮使用靜態工廠模式。
優缺點
優點
- 靜態工廠可以根據使用者傳入的引數來動態地例項化物件,避免一次性例項化所有物件所帶來的效能浪費,同時也降低了耦合性。
缺點
- 每多增加一個產品類,都需要增加一個額外的具體產品類和該類的實現工廠,這很明顯地違背了開閉原則,增加了系統的複雜度。此外,這種“牽一髮而動全身”的寫法,很容易使系統出錯。