設計模式之工廠模式

2021-08-21 03:11:11 字數 3621 閱讀 5868

工廠模式是一種統稱,有三類工廠模式,下面分別介紹。

一、簡單工廠

簡單工廠並不是一種真正的的設計模式,其更像是一種程式設計習慣。主要就是建立乙個類,讓其負責物件的建立。(工廠類中,根據條件決定乙個抽象產品類(介面)由哪個具體產品類來實現。)

類圖:

優點:1、將物件的建立封裝在這乙個類裡面,若以後修改建立的物件,只需要修改這乙個類即可。使**更容易維護。

2、將建立例項的工作與使用例項的工作分開,使用者不必關心類物件如何建立,實現了解耦。

缺點:

1、擴充套件性差,如果是靜態工廠的話,難以通過繼承改變方法的行為。

2、當建立不同的物件需要不同的額外引數時,難以操作(通過方法過載應該也可以操作,可能比較複雜)。

二、工廠方法模式

定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。

類圖:

優點:1、符合開-閉原則。新增一種產品時,只需要增加相應的具體產品類和相應的工廠子類即可。簡單工廠模式需要修改工廠類的判斷邏輯

工廠模式是簡單工廠模式的進一步抽象和拓展,在保留了簡單工廠的封裝優點的同時,讓擴充套件變得簡單,讓繼承變得可行,增加了多型性的體現。

缺點:

1、每次新增乙個或多個具體產品類,也要同時新增乙個具體工廠類或者修改現有工廠類,修改現有工廠類則不符合開-閉原則,新增具體工廠類會使得**複雜化。

例項:

乙個包含工廠方法的抽象類,其實現了除工廠方法外的其它產品操作方法:

public abstract class creator 

//引數化工廠方法,通常情況下乙個工廠只生產乙個產品,不需要引數化

public abstract product createproduct(string name);

}

子類a實現了工廠方法建立例項:

public class creatora extends creator

@override

public product createproduct(string name)

}

子類b實現了工廠方法建立例項:

public class creatorb extends creator

@override

public product createproduct(string name)

}

產品介面:

public inte***ce product
具體產品a:

public class producta implements product

}

具體產品b:

public class productb implements product

}

具體產品c:

public class productc implements product

}

測試**:

public class test 

}

執行結果:

a is working!

hahaha, i am c, a new product!

b is working!

三、抽象工廠抽象工廠模式提供乙個介面,用於建立相關或者依賴物件的家族,而不需要明確指定具體的類。

抽象工廠允許客戶使用抽象的介面來建立一組相關的產品,而不需要知道實際產出的具體產品是什麼。

類圖:

優點:1、工廠和產品都是面向介面程式設計,非常符合物件導向原則。

缺點:

1、產品族的擴充套件將是一件十分費力的事情,假如產品族中需要增加乙個新的產品,則幾乎所有的工廠類都需要進行修改。所以使用抽象工廠模式時,對產品等級結構的劃分是非常重要的。

例項:

乙個抽象的工廠:

public inte***ce abstractfactory
兩個具體的工廠:

public class factory1 implements abstractfactory

@override

public productb createproductb()

}

public class factory2 implements abstractfactory

@override

public productb createproductb()

}

乙個抽象產品a:

public inte***ce producta
兩個具體產品a:

public class producta1 implements producta

}

public class producta2 implements producta

}

乙個抽象產品b:

public inte***ce productb
兩個具體產品b:

public class productb1 implements productb

}

public class productb2 implements productb

}

下面是測試**:

public class processor 

public void process()

}

public class test 

}

執行結果為:

producta is producted!

this is a1, over!

productb is producted!

this is b1!

producta is producted!

this is a2, over!

productb is producted!

this is b2!

設計模式 設計模式之工廠模式

工廠方法模式 建立模式 使用場景?作用?形態?場景 大量類似的實體類 要建立的實體類都是同一本質的東西 披薩 有部分類似功能 準備 烘烤 切法 實現方式不一樣 準備的材料不同 烘烤時間不同 切法不同 將繁瑣複雜的建立類的過程聚集在一起,有序清晰 把具體例項化的過程從客戶 中抽離 作用 1 將建立物件...

c 設計模式 之 工廠模式之 工廠模式

1 uml類圖 實現和依賴關係 實現 sportfactory jeepfactory hatchbackfactory 實現 ifactory 介面 sportcar jeepcar hatchbackcar 實現 icar 介面 依賴 ifactory 依賴 icar sportfactory ...

設計模式 工廠模式之簡單工廠模式

定義 由乙個工廠物件 工廠類 來指定建立某乙個產品類的例項。使用場景 客戶端只需傳入指定的引數即可,工廠類負責建立的物件較少 因為指定了傳入的引數 介面類 本想用iphone命名的,見諒 public inte ce phone實現介面類 public class huaweiphone imple...