【Java設計模式】抽象工廠—產品等級結構與產品族

我是清風~,每天學習一點點,快樂成長多一點,這些都是我的日常筆記以及總結。

抽象工廠

  • 定義:抽象工廠模式提供一個創建一系列相關或相互依賴對象接口
  • 無須指定他們具體的類
  • 類型:創建型
    抽象工廠可以將一組具有同一主題單獨的工作封裝起來。
    正常使用中,客戶端程序,需要創建抽象工廠的具體實現,然後使用抽象工廠,返回接口,來創建這一主題的具體對象。我們使用的時候,是不需要知道和關心,它從這些內部的工廠方法中,獲得對象的具體類型。
    因爲我們的客戶端程序僅使用這些對象的通用接口。
    抽象工廠模式將一組對象的實現細節和他們的使用分離開來。

使用場景

  1. 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
  2. 強調一系列相關的產品對象(屬於同一產品族)一起使用創建對象需要大量重複代碼。
  3. 提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現。

優點

  1. 具體產品在應用層代碼隔離,無須關心創建細節
  2. 將一個系列的產品族統一到一起創建

缺點:

  1. 規定了所有可能被創建的產品集合,產品族中擴展新的產品困難,需要修改抽象工廠的接口
  2. 增加了系統的抽象性和理解難度

抽象工廠——產品等級結構與產品族
下面圖片分析

  • 相同顏色的就是代表一個產品族
  • 相同橢圓形的顏色深淺不同代表一個產品等級結構
    比如
  • 橫着來看,華爲工廠生產【長方形】爲華爲電腦,【圓形】爲華爲手錶,【橢圓形】爲華爲手機,他們都是華爲的品牌,都屬於華爲的產品族
  • 豎着來看,【橢圓形】都是手機,第一排是華爲手機,第二排是小米手機,第三批爲蘋果手機等等,它們屬於同一個產品結構

抽象工廠和工作方法區別

  • 工廠方法針對是產品等級結構
  • 抽象方法針對是產品族

我們只要在華爲工廠裏面取手機,取出來的肯定是華爲手機,所有隻要指出一個產品所處的產品族,以及他所處的等級結構,就可以唯一確定這個產品
在這裏插入圖片描述
接着來看,左側小房子爲具體工廠
華爲生產出來的,手機、手環,電腦,路由器,全是華爲品牌,只要從左側具體工廠取出來的都是屬於同一個產品族

抽象工廠和工廠方法怎麼選擇,看業務場景
從一個工廠可以創建出一個可分屬於不同產品等級結構的一個產品族所有對象時,這個時候抽象工廠模式比工廠方法模式,更爲簡單。
在這裏插入圖片描述

業務場景

在CSDN中學習課程,課程中包含視頻和筆記,
java視頻,python視頻,大數據視頻它們處於同一產品等級,都是視頻
java筆記,python筆記,大數據筆記它們處於同一產品等級,都是筆記
java視頻,java筆記,它們處於同一產品族,都是java相關的

代碼:
先創建課程工廠,使用接口來聲明

public interface CourseFactory {
    /**視頻*/
    Video getVideo();
    /**筆記*/
    Article getArticle();
}

創建抽象類 ,video和article

public abstract class Article {
    public abstract void produce();
}
public abstract class Video {
    public abstract void produce();
}

下面比較重要環節,課程是視頻+筆記,纔可以稱爲課程,那麼我們就聲明一個產品族工廠
聲明java課程的工廠,實現CourseFactory
比工廠方法,我們使用抽象工廠的時候,來做java課程的時候,並沒有聲明視頻的工廠和手記的工廠,而是聲明一個組合到一起的課程工廠,但是具體的產品是有的,具體的java視頻,java筆記
java課程包含產品族,它包含視頻,包含筆記。

public class JavaCourseFactory implements CourseFactory {
	/**視頻*/
    @Override
    public Video getVideo() {
        return new JavaVideo();
    }

    @Override
    public Article getArticle() {
        return new JavaArticle();
    }
}

創建創建java視頻javaVideo

public class JavaVideo extends Video {
    //java學習視頻的實現
    @Override
    public void produce() {
        System.out.println("學習Java課程視頻");
    }
}

創建java筆記 JavaArticle

public class JavaArticle extends Article {
    //java學習手記的實現
    @Override
    public void produce() {
        System.out.println("編寫Java課程手記");
    }
}

下面再寫一套python的課程
創建python的課程工廠PythonCourseFactory ,實現課程工廠CourseFactory

public class PythonCourseFactory implements CourseFactory {
    @Override
    public Video getVideo() {
        return new PythonVideo();
    }

    @Override
    public Article getArticle() {
        return new PythonArticle();
    }
}
public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("學習Python課程視頻");
    }
}

public class PythonArticle extends Article {
    @Override
    public void produce() {
        System.out.println("編寫Python課程筆記");
    }
}

測試

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

我想要學習java課程

輸出結果
學習Java課程視頻
編寫Java課程筆記

UML類圖分析

產品族的工廠CourseFactory有兩個具體的PythonCourseFactory和JavaCourseFactory工廠
java課程工廠生產javavideo和java筆記
python課程工廠生產pythonvideo和python筆記
而video和article作爲整個產品族工作的返回值就是,CourseFactory、PythonCourseFactory、JavaCourseFactory依賴抽象產品video,依賴抽象產品article
要是我這裏添加了大數據課程工廠,對於現在的抽象模式工廠很好擴展,對原來的類不需要變化
只需要創建一個大數據課程工廠,創建大數據video,大數據article
還有一個好處,就是test這個客戶端,不需要關心這個產品族創建的過程應用層代碼只需要關心他是哪個工廠即可,因爲應用層代碼不會直接創建java筆記,python手記,與java視頻,pyhon視頻,因爲整個創建過程是交由具體的創建工廠創建的,並且創建是一個產品族產品,這裏創建的肯定是java不會錯
在這裏插入圖片描述

源碼分析——Connection類

ctrl+N 搜索Connection
數據庫連接的接口

返回Statement
返回PreparedStatement
很容易理解,在Connection接口裏面中返回都是同一個產品族
例如創建一個mysql的Connection,從這裏獲取的無論是Statement還是PreparedStatement,都是對於db的連接
也就是mysql取獲取的時候,肯定獲取到mysql數據連接的Statement
所以這裏定義各種不同的方法都是屬於同一個產品族
在這裏插入圖片描述

    PreparedStatement prepareStatement(String sql)
        throws SQLException;

再看下Statement,這也是一個接口
下面有各種返回,都屬於同一個Statement,很明顯這也是一個抽象工廠
在這裏插入圖片描述
所以在mysql裏面很容易就很理解什麼是抽象工廠,以及在jdk怎麼使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章