模式定義
提供一個創建對象實例的功能,而無須關心其具體實現。被創建實例的類型可以是接口、抽象類,也可以是具體的類。
模式結構
模式結構
代碼實現
public interface Human {
void print();
}
public class Man implements Human {
public void print() {
System.out.println("我是男人");
}
}
public class Woman implements Human {
public void print() {
System.out.println("我是女人");
}
}
//這里也可以不用傳入參數創建對象,可以使用讀取配置,通過反射創建對象
public class HumanFactory {
public Human createHuman(String type){
if("man".equals(type)){
return new Man();
}else if("woman".equals(type)){
return new Woman();
}else {
return null;
}
}
}
public class Client {
public static void main(String[] args) {
HumanFactory factory = new HumanFactory();
Human man = factory.createHuman("man");
man.print();
}
}
模式的優缺點
優點
封裝
使組件外部能真正面向接口編程。解耦
通過簡單工廠,實現了客戶端和具體實現類的解耦。
缺點
可能增加客戶端的復雜度
不方便擴展子工廠
私有化簡單工廠的構造方法,使用靜態方法來創建接口,也就不能通過寫簡單工廠類的子類來改變創建接口的方法的行為了。
思考
模式本質:選擇實現
簡單工廠的重點在選擇,實現是已經做好了的。就算實現再簡單,也要由具體的實現類來實現,而不是在簡單工廠里面來實現。簡單工廠的目的在于為客戶端來選擇相應的實現,從而使得客戶端和實現之間解耦。
難點在“如何選擇”實現,參數傳遞可以是靜態的參數,也可以是動態的參數。比如:運行期間。由工廠去讀取某個內存的值,或者去讀取數據庫中的值,然后根據這個值來選擇具體的實現等。