1.問題背景:
現在有兩個產品(Product)分別是手機殼(PhoneCase)和耳機(EarPhone),但是他們會來自于各個生產廠商,比如說Apple和Android等等
那么至少會有四個產品,分別是安卓手機殼,安卓耳機,蘋果手機殼,蘋果耳機。
但是安卓手機殼和安卓耳機都是安卓體系,所以想到采用工廠方式,一個工廠一起就把這兩個類創建了
那用戶至少會有兩個體系,安卓和蘋果,如果說用戶說安卓體系就用安卓的工廠去創建,蘋果體系就用蘋果的工廠去創建
那么問題來了,兩個體系倒還好,那萬一后面還多了,鴻蒙系統、linux、mac之類的系統,肯定是不可能通過if、 else if去選擇創建產品的工廠
迎面而來的解決方法就是通過抽象工廠,這也就是抽象工廠設計模式
2.介紹抽象工廠
一個體系下有兩個產品,這兩個產品我們可以用工廠一次創建,關鍵問題是體系太多不好定義,所以我們可以抽象一個工廠,然后不同體系基于該工廠去實現,去定義自己的創建產品的邏輯
但是這樣又有一個問題,工廠生產出來的類至少有兩個,所以我們需要一個Client類,來接受工廠生成出來的產品類(手機殼和耳機),并且管理每個類的具體方法
3.手搓代碼環節
3.1項目結構
3.2product
耳機的通用方法
package?product;public?interface?EarPhone?{
public?void?useEarphone();
}
手機殼的通用方法
package?product;public?interface?PhoneCase?{
public?void?protectPhone();
}
蘋果耳機的具體實現
package?product;public?class?AppleEarphone?implements?EarPhone{
@Override
public?void?useEarphone()?{
System.out.println("使用蘋果耳機");
}
}
蘋果手機殼的具體實現
package?product;public?class?ApplePhoneCase?implements?PhoneCase{
@Override
public?void?protectPhone()?{
System.out.println("保護蘋果手機");
}
}
安卓耳機的具體實現
package?product;public?class?AndroidEarphone?implements?EarPhone{
@Override
public?void?useEarphone()?{
System.out.println("使用安卓耳機");
}
}
安卓手機殼的具體實現
package?product;public?class?AndroidPhoneCase?implements?PhoneCase?{
@Override
public?void?protectPhone()?{
System.out.println("保護安卓手機");
}
}
3.3sysfactory
通用工廠接口,因為每個工廠都需要創建對應的耳機類和手機殼類
package?sysfactory;import?product.EarPhone;
import?product.PhoneCase;public?interface?AccessoryFactory?{
public?PhoneCase?createPhoneCase();
public?EarPhone?createEarphone();
}
蘋果工廠實現
package?sysfactory;import?product.AppleEarphone;
import?product.ApplePhoneCase;
import?product.EarPhone;
import?product.PhoneCase;public?class?AppleAccessoryFactory?implements?AccessoryFactory{
@Override
public?PhoneCase?createPhoneCase()?{
return?new?ApplePhoneCase();
}
@Override
public?EarPhone?createEarphone()?{
return?new?AppleEarphone();
}
}
安卓工廠實現
package?sysfactory;import?product.AndroidEarphone;
import?product.AndroidPhoneCase;
import?product.EarPhone;
import?product.PhoneCase;public?class?AndroidAccessoryFactory?implements?AccessoryFactory?{
@Override
public?PhoneCase?createPhoneCase()?{
return?new?AndroidPhoneCase();
}
@Override
public?EarPhone?createEarphone()?{
return?new?AndroidEarphone();
}
}
3.4client
package?client;import?product.EarPhone;
import?product.PhoneCase;
import?sysfactory.AccessoryFactory;public?class?Client?{
private?final?PhoneCase?phoneCase;
private?final?EarPhone?earphone;public?Client(AccessoryFactory?factory)?{
this.phoneCase?=?factory.createPhoneCase();
this.earphone?=?factory.createEarphone();
}public?void?useAccessories()?{
phoneCase.protectPhone();
earphone.useEarphone();
}
}
3.5主類
package?app;import?client.Client;
import?sysfactory.AccessoryFactory;
import?sysfactory.AndroidAccessoryFactory;
import?sysfactory.AppleAccessoryFactory;public?class?Main?{
public?static?void?main(String[]?args)?{
AccessoryFactory?appleFactory?=?new?AppleAccessoryFactory();
Client?appleClient?=?new?Client(appleFactory);
appleClient.useAccessories();AccessoryFactory?androidFactory?=?new?AndroidAccessoryFactory();
Client?androidClient?=?new?Client(androidFactory);
androidClient.useAccessories();
Client?appleClient1?=?new?Client(new?AppleAccessoryFactory());
appleClient1.useAccessories();}
}