工廠方法模式

工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而克服了它的缺點。首先,在工廠方法模式中核心工廠類不在負責所有產品的創建,而是將具體創建的工作交給子類去做。這個核心類則稱爲一個抽象工廠角色,不接觸具體產品類實例化的細節。當引入新的產品的時候,就可以在不修改具體工廠角色,這一特點是的工廠方法模式有着超越簡單工廠模式的優越性。

工廠方法模式的定義:Define an interface for creating an object, but let subclasses to decide which class to instance. Factory Method let a class defer instance to subclass.

意思是:定義一個用於創建對象的接口,讓子類決定具體實例化哪個類。工廠方法使一個類的實例化推遲到子類中去。


工廠方法模式的UML圖如下:


共涉及到4個角色,與簡單工廠模式相比多了一個抽象工廠角色:

抽象工廠角色(Creator):該角色是工廠方法模式的核心,具體工廠類必須實現這個接口

具體工廠模式(ConcreteCreator):實現抽象工廠接口,含有與應用密切相關的邏輯。

抽象產品角色(Product):定義產品的一些共性,實現產品的抽象定義。

具體產品角色(ConcreteProduct):實現抽象產品角色接口,工廠方法模式所創建的每個對象都是具體產品的一個實例。


工廠方法模式的一個應用:

以Apple公司生產電腦和手機爲例

抽象產品接口:

public interface Product {

	public void use();
	
}

兩個具體產品角色,實現上述接口:

Phone

public class Phone implements Product {
	
	@Override
	public void use() {
		System.out.println("Phone is calling now.");
	}
}

Computer

public class Computer implements Product {

	public void use() {
		System.out.println("Computer is online now.");
	}
}

核心抽象工廠角色

Factory

public interface Factory {

	public Product produce();
	
}

具體工廠角色,與具體產品角色對應,這裏也有兩個

PhoneFactory

public class PhoneFactory implements Factory {

	@Override
	public Product produce() {
		return new Phone();
	}
	
}

ComputerFactory

public class ComputerFactory implements Factory {

	@Override
	public Product produce() {
		return new Computer();
	}
	
}

客戶端調用測試:

public class Test {

	public static void main(String[] args) {
		//獲取電腦工廠生產電腦
		Factory cf = new ComputerFactory();
		Product computer = cf.produce();
		computer.use();
		
		//獲取手機工廠生產手機
		Factory pf = new PhoneFactory();
		Product phone = pf.produce();
		phone.use();
	}
}

工廠方法模式的優點:

  • 良好的封裝性,代碼結構清晰,解耦合程度高;
  • 優秀的可擴展性,在增加新產品的時候,只需要修改具體工廠類。
  • 屏蔽產品類,產品類的具體實現,調用者都無需關心。









發佈了65 篇原創文章 · 獲贊 34 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章