定義與類型
定義:抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口
無(wú)須指定它們具體的類
類型:創(chuàng)建型
適用場(chǎng)景
- 客戶端(應(yīng)用層)不依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、實(shí)現(xiàn)等細(xì)節(jié)
- 強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象(屬于同一產(chǎn)品族)一起使用,創(chuàng)建對(duì)象需要大量重復(fù)代碼
- 提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實(shí)現(xiàn)
優(yōu)點(diǎn)
- 具體產(chǎn)品在應(yīng)用層代碼隔離,無(wú)須關(guān)心創(chuàng)建細(xì)節(jié)
- 將一個(gè)系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建
缺點(diǎn)
- 規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,產(chǎn)品族中擴(kuò)展新的產(chǎn)品困難,需要修改抽象工廠的接口
- 增加了系統(tǒng)的抽象性和理解難度
產(chǎn)品等級(jí)結(jié)構(gòu)與產(chǎn)品族
以空調(diào)為例:
美的空調(diào),格力空調(diào),奧克斯空調(diào)等是同一產(chǎn)品等級(jí)結(jié)構(gòu)。
美的空調(diào),美的電飯煲,美的微波爐等是同一產(chǎn)品族。
抽象工廠適用于產(chǎn)品族,工廠方法適用于產(chǎn)品等級(jí)結(jié)構(gòu)。
代碼示例
仍然以視頻課程為例,現(xiàn)在有了新的要求,視頻加上筆記才能構(gòu)成一個(gè)完整的課程。
- 創(chuàng)建CourseFactory 接口
/**
* @author lijiayin
*/
public interface CourseFactory {
Video getVideo();
Article getArticle();
}
- 創(chuàng)建Video 抽象類
/**
* @author lijiayin
*/
public abstract class Video {
public abstract void produce();
}
- 創(chuàng)建Article 抽象類
/**
* @author lijiayin
*/
public abstract class Article {
public abstract void produce();
}
- 創(chuàng)建JavaVideo 類
/**
* @author lijiayin
*/
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("Java視頻");
}
}
- 創(chuàng)建JavaArticle 類
/**
* @author lijiayin
*/
public class JavaArticle extends Article {
@Override
public void produce() {
System.out.println("Java筆記");
}
}
- 同理創(chuàng)建Python相關(guān)的類
/**
* @author lijiayin
*/
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("Python視頻");
}
}
/**
* @author lijiayin
*/
public class PythonArticle extends Article {
@Override
public void produce() {
System.out.println("Python筆記");
}
}
/**
* @author lijiayin
*/
public class PythonCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new PythonVideo();
}
](https://upload-images.jianshu.io/upload_images/18537440-24059b12568b35e2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

@Override
public Article getArticle() {
return new PythonArticle();
}
}
- 創(chuàng)建測(cè)試類
/**
* @author lijiayin
*/
public class Test {
public static void main(String[] args) {
CourseFactory java = new JavaCourseFactory();
java.getArticle().produce();
java.getVideo().produce();
CourseFactory python = new PythonCourseFactory();
python.getVideo().produce();
python.getArticle().produce();
}
}
-
測(cè)試結(jié)果
測(cè)試結(jié)果.png -
UML圖
UML.png
JDK源碼示例
java.sql.Connection接口,當(dāng)使用Oracle數(shù)據(jù)庫(kù)時(shí),Statement createStatement() throws SQLException和PreparedStatement prepareStatement(String sql)throws SQLException這兩個(gè)方法,返回的都是Oracle相關(guān)的具體實(shí)現(xiàn);當(dāng)使用Mysql時(shí),返回的都是Mysql的相關(guān)的具體實(shí)現(xiàn)。

