設計模式---【抽象工廠模式】
阿新 • • 發佈:2018-12-18
目錄
前言
此文章記錄自己所學,不對之處歡迎糾正。文中有些欄位、圖片通過書籍摘抄而來,非常感謝原作者。
一、定義
提供一個建立一系列相關或相互依賴物件的介面,而無須指定它們具體的類。每一個具體工廠都提供了多個工廠方法建立多種不同型別的產品,這些產品構成了一個產品族。
- 產品等級結構:如有一個介面是課程,繼承此介面的類有java課程、python課程、前端課程。抽象課程是課程介面(父類),具體課程(子類)是java課程、Python課程等等。這時,抽象課程與具體課程構成了一個產品等級結構。
- 產品族:指由同一個工廠生產的。如java課程工廠生產java視訊、java手記;Java視訊位於視訊產品等級結構中,java手記位於手記產品等級結構中。java視訊、java手記位於一個產品族。
二、優缺點
- 優點
- 增加新的產品族非常方便,無須修改現有系統,符合開閉原則。
- 缺點
- 增加新的產品等級結構非常麻煩,需要修改原有系統。
二、程式碼
1.產品相關類
/**
* 抽象視訊介面
*/
public interface Video {
/** 生產視訊方法 */
void produce();
}
/** * 生產java視訊【具體類】 */ public class JavaVideo implements Video { @Override public void produce() { System.out.println("錄製java課程視訊"); } }
/**
* 生產Python視訊類【具體類】
*/
public class PythonVideo implements Video {
@Override
public void produce() {
System.out.println("錄製Python視訊");
}
}
/**
* 手記抽象介面
*/
public interface Article {
void produce();
}
/** * 生產java手記類【具體類】 */ public class JavaArticle implements Article { @Override public void produce() { System.out.println("編寫java手記"); } }
/**
* 生產Python視訊類【具體類】
*/
public class PythonArticle implements Article {
@Override
public void produce() {
System.out.println("編寫Python手記");
}
}
2.工廠相關類
/**
* 課程抽象介面
* 課程由視訊、手記組成
*/
public interface CourseFactory {
/** 視訊 */
Video produceVideo();
/** 手記 */
Article produceArticle();
}
/**
* java課程工廠
*/
public class JavaCourseFactory implements CourseFactory {
/** 生產java視訊 */
@Override
public Video produceVideo() {
return new JavaVideo();
}
/** 生產java手記 */
@Override
public Article produceArticle() {
return new JavaArticle();
}
}
/**
* python課程工廠
*/
public class PythonCourseFactory implements CourseFactory {
/** 生產python視訊 */
@Override
public Video produceVideo() {
return new PythonVideo();
}
/** 生產python手記 */
@Override
public Article produceArticle() {
return new PythonArticle();
}
}
/**
* 測試類
*/
public class Test {
public static void main(String[] args) {
//建立java課程工廠
CourseFactory javaCourseFactory = new JavaCourseFactory();
//生產java視訊、手記
Video jVideo = javaCourseFactory.produceVideo();
Article jArticle = javaCourseFactory.produceArticle();
jVideo.produce();
jArticle.produce();
//建立python課程工廠
CourseFactory pythonCourseFactory = new PythonCourseFactory();
//生產python視訊、手記
Video pVideo = pythonCourseFactory.produceVideo();
Article pArticle = pythonCourseFactory.produceArticle();
pVideo.produce();
pArticle.produce();
}
}