設計模式-靜態工廠模式

葉少磐發表於2019-04-12

靜態工廠模式

引言

追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();
	}

}
複製程式碼

總結

使用場景

所需要建立的類的數量不是很多的場景下,可以考慮使用靜態工廠模式。

優缺點

優點

  1. 靜態工廠可以根據使用者傳入的引數來動態地例項化物件,避免一次性例項化所有物件所帶來的效能浪費,同時也降低了耦合性。

缺點

  1. 每多增加一個產品類,都需要增加一個額外的具體產品類和該類的實現工廠,這很明顯地違背了開閉原則,增加了系統的複雜度。此外,這種“牽一髮而動全身”的寫法,很容易使系統出錯。

相關文章