設計模式(2) 抽象工廠模式

2021-08-20 16:13:03 字數 3874 閱讀 7339

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

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

首先,我們想求乙個形狀的周長。定義乙個形狀的抽象類

public abstract class shape

然後建立兩個子類,四邊形類與三角形類

public class quadrilateral: shape

}public class ******** : shape

}

然後我們建立乙個抽象工廠類與繼承了抽象工廠類的三角形工廠類和四邊形工廠類,他們各自的作用就是建立各自的例項

/// /// 抽象工廠類

///

public abstract class creator

/// /// 三角形工廠類

///

public class ********factory : creator

}/// /// 四邊形工廠類

///

public class quadrilateralfactory : creator

}

然後這樣呼叫

// 初始化形狀的兩個工廠()

creator ********factory = new ********factory();

creator quadrilateralfactory = new quadrilateralfactory();

// 開始求三角形周長

shape******** = ********factory.createshape();

********.getperimeter();

// 開始求四邊形周長

shapequadrilateral= quadrilateralfactory .createshape();

quadrilateral.getperimeter();

他的類圖

此時如果增加乙個五邊形或者六邊形,我們就不需要像簡單工廠一樣改那個方法了,這樣就會造成簡單工廠的實現邏輯過於複雜,而且不符合開閉原則(對修改關閉、對擴充套件開發),而是去擴充套件幾個新的類就好了。

public class pentagon : shape

}/// /// 五邊形工廠類

///

public class pentagonfactory : creator

}//呼叫方法

creator pentagonfactory = new pentagonfactory();

// 開始求五邊形周長

shapepentagon = pentagonfactory.createshape();

pentagon.getperimeter();

他的類圖

每個具體工廠類只完成單個例項的建立,所以它具有很好的可擴充套件性。但是在現實生活中,乙個工廠只建立單個產品這樣的例子很少,因為現在的工廠都多元化了,乙個工廠建立一系列的產品,如果我們要設計這樣的系統時,工廠模式顯然在這裡不適用,然而抽象工廠模式卻可以很好地解決一系列產品建立的問題。

先建立乙個抽象的形狀類與兩個抽象子類

public abstract class quadrilateral : shape

public abstract class ********: shape

public abstract class shape

然後建立他們的子類

/// /// 直角三角形

///

public class rightangled******** : ********

}/// /// 銳角三角形

///

public class acuteangled******** : ********

}/// /// 矩形

///

public class rectangle : quadrilateral

}/// /// 梯形

///

public class trapezoid : quadrilateral

}

建立乙個抽象工廠與兩個工廠子類

/// /// 抽象工廠類,提供建立兩個形狀的介面

///

public abstract class abstractfactory

/// /// 直角工廠類,只創造直角

///

public class rightangledfactory : abstractfactory

public override ******** create********()

}/// /// 銳角工廠類

///

public class acuteangledfactory : abstractfactory

public override ******** create********()

}

呼叫方法

// 直角工廠求直角形狀的面積

abstractfactory rightangledfactory = new rightangledfactory();

******** rightangled******** = rightangledfactory.create********();

rightangled********.getarea();

quadrilateral rectangle = rightangledfactory.createquadrilateral();

rectangle.getarea();

// 銳角工廠求銳角形狀的面積

abstractfactory acuteangledfactory = new acuteangledfactory();

******** acuteangled******** = acuteangledfactory.create********();

acuteangled********.getarea();

quadrilateral trapezoid = acuteangledfactory.createquadrilateral();

trapezoid.getarea();

抽象工廠模式將具體產品的建立延遲到具體工廠的子類中,這樣將物件的建立封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴充套件,這真是抽象工廠模式的優點所在,然後抽象模式同時也存在不足的地方。下面就具體看下抽象工廠的缺點(缺點其實在前面的介紹中以已經涉及了):

抽象工廠模式很難支援新種類產品的變化。這是因為抽象工廠介面中已經確定了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了「開發——封閉」原則。

知道了抽象工廠的優缺點之後,也就能很好地把握什麼情況下考慮使用抽象工廠模式了,下面就具體看看使用抽象工廠模式的系統應該符合那幾個前提:

本文借鑑了《gof設計模式》與《c#設計模式(4)——抽象工廠模式》

設計模式 2抽象工廠模式

就是把 生產 水果的工廠 生產糧食的工廠 等等 一些工廠 按照工廠模式抽象出乙個超級工廠來生成這些普通工廠。2factory 工廠類 3 呼叫方法 package com.project.no2abstractfactorypattern.main import com.project.no2abs...

設計模式2 抽象工廠

建立多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了 介面public inte ce sender 實現類mail public class mailsender implements sender 實現類sms public class smssender implements ...

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

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