1. 程式人生 > >設計模式---【抽象工廠模式】

設計模式---【抽象工廠模式】

目錄

前言

一、定義

二、優缺點

二、程式碼

前言

此文章記錄自己所學,不對之處歡迎糾正。文中有些欄位、圖片通過書籍摘抄而來,非常感謝原作者。

一、定義

提供一個建立一系列相關或相互依賴物件的介面,而無須指定它們具體的類。每一個具體工廠都提供了多個工廠方法建立多種不同型別的產品,這些產品構成了一個產品族。

  • 產品等級結構:如有一個介面是課程,繼承此介面的類有java課程、python課程、前端課程。抽象課程是課程介面(父類),具體課程(子類)是java課程、Python課程等等。這時,抽象課程與具體課程構成了一個產品等級結構。
  • 產品族:指由同一個工廠生產的。如java課程工廠生產java視訊、java手記;Java視訊位於視訊產品等級結構中,java手記位於手記產品等級結構中。java視訊、java手記位於一個產品族。

二、優缺點

  • 優點
  1. 增加新的產品族非常方便,無須修改現有系統,符合開閉原則。
  • 缺點
  1. 增加新的產品等級結構非常麻煩,需要修改原有系統。

二、程式碼

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();
    }
}

三、UML類圖