抽象工廠模式提供一個建立一系列相關或相互依賴對象的接口。 無須指定它們具體的類。 適用場景: 1) 客戶端不依賴於產品類實例如何被建立、實現等細節 2) 強調一系列相關的產品對象(屬於同一個產品族)一塊兒使用建立對象對象須要大量重複代碼 3) 提供一個產品類的庫,全部產品以一樣的接口出現,從而使客戶端不依賴於具體的實現 優勢: 1) 具體產品在應用層代碼隔離,無須關心建立細節 2) 將一個系列的產品族統一到一塊兒建立 缺點: 1) 規定了全部可能被建立的產品集合,產品族中擴展新的產品困難,須要修改抽象工廠的集合 2) 增長了系統的抽象性和理解難度
下圖是抽象工廠的產品族和產品等級結構。同一行是一個產品族,好比同屬美的公司生產的冰箱、空調。而同一列則是同一類產品,好比美的的空調、海爾的空調。工廠方法模式針對的產品等級結構,而抽象工廠模式針對的是產品族,這是工廠方法和抽象工廠模式最大的區別
。ide
public abstract class Video { public abstract void produce(); } public class JavaVideo extends Video { @Override public void produce() { System.out.println("錄製Java課程視頻"); } } public class PythonVideo extends Video { @Override public void produce() { System.out.println("錄製Python課程視頻"); } }
public abstract class Article { public abstract void produce(); } public class JavaArticle extends Article { @Override public void produce() { System.out.println("編寫Java課程手記"); } } public class PythonArticle extends Article { @Override public void produce() { System.out.println("編寫Python課程手記"); } }
public interface CourseFactory { Video getVideo(); Article getArticle(); }
public class JavaCourseFactory implements CourseFactory { @Override public Video getVideo() { return new JavaVideo(); } @Override public Article getArticle() { return new JavaArticle(); } } public class PythonCourseFactory implements CourseFactory { @Override public Video getVideo() { return new PythonVideo(); } @Override public Article getArticle() { return new PythonArticle(); } }
public class Test { public static void main(String[] args) { CourseFactory courseFactory = new JavaCourseFactory(); Video video = courseFactory.getVideo(); Article article = courseFactory.getArticle(); video.produce(); article.produce(); } }