設計模式 抽象工廠模式實現檔案資料匯出功能

2021-10-13 12:44:14 字數 4657 閱讀 3729

將資料庫中的資料進行處理然後使用excel進行匯出。

資料種類(產品族)分為指定幾種,種類下面有不同的產品(類似不同工廠有不同的產品),每次觸發介面都是使用某一產品作為實體返回。考慮到需求和資料格式決定使用抽象工廠設計模式完成此需求。

抽象工廠模式(abstract factory pattern)是圍繞乙個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

意圖:提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

主要解決:主要解決介面選擇的問題

何時使用:系統的產品有多於乙個的產品族,而系統只消費其中某一族的產品。

如何解決:在乙個產品族裡面,定義多個產品。

關鍵**:在乙個工廠裡聚合多個同類產品。

應用例項:工作了,為了參加一些聚會,肯定有兩套或多套衣服吧,比如說有商務裝(成套,一系列具體產品)、時尚裝(成套,一系列具體產品),甚至對於乙個家庭來說,可能有商務**、商務**、時尚**、時尚**,這些也都是成套的,即一系列具體產品。假設一種情況(現實中是不存在的,要不然,沒法進入共產主義了,但有利於說明抽象工廠模式),在您的家中,某乙個衣櫃(具體工廠)只能存放某一種這樣的衣服(成套,一系列具體產品),每次拿這種成套的衣服時也自然要從這個衣櫃中取出了。用 oop 的思想去理解,所有的衣櫃(具體工廠)都是衣櫃類的(抽象工廠)某乙個,而每一件成套的衣服又包括具體的上衣(某一具體產品),褲子(某一具體產品),這些具體的上衣其實也都是上衣(抽象產品),具體的褲子也都是褲子(另乙個抽象產品)。

優點:當乙個產品族中的多個物件被設計成一起工作時,它能保證客戶端始終只使用同乙個產品族中的物件。

缺點:產品族擴充套件非常困難,要增加乙個系列的某一產品,既要在抽象的 creator 裡加**,又要在具體的裡面加**。

使用場景:

1、客戶端(應用層)不依賴於產品類例項如何被建立、實現等細節

2、強調一系列相關的產品物件(屬於同一產品族)一起使用建立物件需要大量重複的**

3、提供乙個產品類的庫,所有的產品以同樣的介面出現,從而使客戶端不依賴於具體實現

注意事項:產品族難擴充套件,產品等級易擴充套件。

抽象工廠抽象基類,通過抽象基類獲取指定工廠

public

abstract

class

abstractfactory

建立乙個工廠創造器/生成器類,通過傳遞要獲取的工廠名稱來獲取工廠

@component

@requiredargsconstructor

public

class

factoryproducer

elseif(

"hotquestionfactory"

.equalsignorecase

(choice)

)return null;

}}

工廠a,在此根據產品名稱從工廠中獲取指定的產品

@component

@requiredargsconstructor

public

class

complaintfactory

extends

abstractfactory

elseif(

"area"

.equalsignorecase

(flag)

)elseif(

"street"

.equalsignorecase

(flag)

)return null;

}@override

public hotquestion gethotquestionimpl

(string flag)

}

為工廠a的產品建立乙個介面。此類代表所有工廠a的產品,用於方法函式返回物件。

在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。

public

inte***ce

complainttworate

工廠a的產品a。

@component

@requiredargsconstructor

public

class

complainttworateandtworatiocity

implements

complainttworate

@override

public

void

addaliasanddata

(bigexcelwriter writer, list

tlist)

}

工廠a的產品b。

@component

@requiredargsconstructor

public

class

complainttworateandtworatioarea

implements

complainttworate

@override

public

void

addaliasanddata

(bigexcelwriter writer, list

tlist)

}

工廠b,在此根據產品名稱從工廠中獲取指定的產品

@component

@requiredargsconstructor

public

class

hotquestionfactory

extends

abstractfactory

@override

public hotquestion gethotquestionimpl

(string flag)

elseif(

"b".

equalsignorecase

(flag)

)elseif(

"c".

equalsignorecase

(flag)

)return null;

}}

為工廠b的產品建立乙個介面。此類代表所有工廠b的產品,用於方法函式返回物件。(作用同complainttworate)

public

inte***ce

hotquestion

工廠b的產品c

@component

@requiredargsconstructor

public

class

hotquestionimplcity

implements

hotquestion

@override

public

void

addaliasanddata

(bigexcelwriter writer, list

tlist)

}

工廠c的產品d

@component

@requiredargsconstructor

public

class

hotquestionimplarea

implements

hotquestion

@override

public

void

addaliasanddata

(bigexcelwriter writer, list

tlist)

}

使用 fileexportcontroller 來獲取 abstractfactory,通過傳遞名稱來獲取實體類的物件。

//獲取工廠

abstractfactory fileexportfactory = factoryproducer.

getfactory

("complaintfactory");

//獲取產品

complainttworate complainttworatecity = fileexportfactory.

getcomplainttworate

("city");

// 呼叫方法-填充欄位名和資料

complainttworatecity.

addaliasanddata(.

..);

簡單工廠模式有乙個問題就是,類的建立依賴工廠類,也就是說,如果想要拓展程式,必須對工廠類進行修改。

抽象工廠模式中我們可以定義實現不止乙個介面,乙個工廠也可以生成不止乙個產品類,抽象工廠模式較好的實現了「開放-封閉」原則,是三個模式中較為抽象,並具一般性的模式。

本例中資料種類為產品族,某一資料為產品。

綜上抽象工廠模式更合適此情景。

模擬較多容易混亂,所以對類名設計嚴格遵守阿里編碼規範中的對類名涉及要求:

設計模式 抽象工廠模式實現

抽象工廠方法 抽象工廠模式是圍繞乙個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。一 基本模式的實現 以乙個使...

設計模式 工廠模式 抽象工廠模式

建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...

抽象工廠模式 常用設計模式 抽象工廠模式

提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。在工廠方法模式中,我們的具體建立者每次使用都只能建立乙個同型別的物件,假如我們現在需要的是多個不同型別的物件,工廠方法就滿足不了需求了。這時我們可以把多個工廠方法組合到乙個類,這就是抽象工廠模式,它就是專門用來建立多個產品,也可以說...