簡述
前面我們學(xué)習(xí)過簡單工廠模式,它解決了一類對象的創(chuàng)建問題,但是有的時候?qū)ο蠛軓?fù)雜,數(shù)量多,還分為了好幾種類別。如果只有一個工廠,面多如此多的產(chǎn)品,這個工廠需要實現(xiàn)的邏輯就太復(fù)雜了,所以我們希望把工廠分為好幾個,便于產(chǎn)品規(guī)則的維護。設(shè)計者只需要提供給用戶一個抽象工廠,抽象工廠內(nèi)部會自動選擇使用哪個工廠生產(chǎn)哪種產(chǎn)品
案例
- 這里以兩種工廠為例,一種生產(chǎn)水果,一種生產(chǎn)文具,代碼以打印到控制臺的方式來簡要說明
- demo代碼可到抽象工廠模式中下載
【產(chǎn)品接口】
public interface IProduct {
//案例中不提供實現(xiàn)類,以打印到控制臺的方式說明
}
【工廠接口】
/**
* 抽象工廠和具體工廠都要實現(xiàn)本接口
*/
public interface IProductFactory {
public IProduct createProduct(String productNo);
}
【具體工廠1 - 水果】
public class ProductFactory1 implements IProductFactory {
/**
* @param productNo 產(chǎn)品編號
* @return 本具體工廠只負(fù)責(zé)生產(chǎn)水果,水果編號都以A開頭
*/
@Override
public IProduct createProduct(String productNo) {
//這里不提供IProduct的實現(xiàn)類,以打印文字的方法簡略表示
if("A1".equals(productNo)){
System.out.println("生產(chǎn)一個蘋果");
}else if ("A2".equals(productNo)){
System.out.println("生產(chǎn)一個鴨梨");
}else {
System.out.println("水果工廠暫不生產(chǎn)該水果");
}
return null;
}
}
【具體工廠2 - 文具】
/**
* 本具體工廠只生產(chǎn)文具,產(chǎn)品編號以B開頭
*/
public class ProductFactory2 implements IProductFactory {
@Override
public IProduct createProduct(String productNo) {
if("B1".equals(productNo)){
System.out.println("生產(chǎn)了一支筆");
}else if ("B2".equals(productNo)){
System.out.println("生產(chǎn)了一個橡皮");
}else {
System.out.println("本文具工廠暫不生產(chǎn)該文具");
}
return null;
}
}
【抽象工廠】
/**
* 抽象工廠,負(fù)責(zé)制定某個具體工廠生產(chǎn)某件產(chǎn)品
*/
public class ProductFactory implements IProductFactory {
public IProduct createProduct(String productNo) {
char type = productNo.charAt(0);
IProductFactory factory = null;
if(type == 'A'){
factory = new ProductFactory1();
}else if(type == 'B'){
factory = new ProductFactory2();
}
if(factory != null) factory.createProduct(productNo);
return null;
}
}
【測試】
public class Test {
public static void main(String[] args) {
ProductFactory productFactory = new ProductFactory();
productFactory.createProduct("A1");//生產(chǎn)一個蘋果
productFactory.createProduct("A2");//生產(chǎn)一個鴨梨
productFactory.createProduct("B1");//生產(chǎn)了一支筆
productFactory.createProduct("B2");//生產(chǎn)了一個橡皮
}
}