工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而克服了它的缺點。首先,在工廠方法模式中核心工廠類不在負責所有產品的創建,而是將具體創建的工作交給子類去做。這個核心類則稱爲一個抽象工廠角色,不接觸具體產品類實例化的細節。當引入新的產品的時候,就可以在不修改具體工廠角色,這一特點是的工廠方法模式有着超越簡單工廠模式的優越性。
工廠方法模式的定義: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();
}
}
工廠方法模式的優點:
- 良好的封裝性,代碼結構清晰,解耦合程度高;
- 優秀的可擴展性,在增加新產品的時候,只需要修改具體工廠類。
- 屏蔽產品類,產品類的具體實現,調用者都無需關心。