工廠模式之二 工廠方法模式

2021-08-27 03:36:50 字數 2514 閱讀 9275

工廠方法模式:乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類。

工廠方法克服了簡單工廠違反開發-封閉原則的缺點,既保持了封裝物件建立過程的優點。

工廠方法模式實現時,客戶端需要決定例項化哪乙個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說工廠方法把簡單工廠的內部邏輯判斷轉移到了客戶端**中進行。你想要加功能,本來是改工廠類的而現在是修改客戶端。

creator:工廠類介面,將建立各個產品的具體的工廠抽象出來成乙個介面。

concretecreateor:具體的工廠類,不同的工廠類建立不同的產品。

product:產品的介面,將各個產品抽象出來成乙個抽象類。

concreteproduct:具體的產品。

還是和上篇的簡單工廠模式是同乙個例項。

實現乙個計算器程式,要求輸入兩個數和運算符號,得到結果。

類圖

編碼實現:

ifactory介面:

將加減乘除運算類的各個工廠類抽象成乙個抽象工廠類。

public

inte***ce ifactory

加法工廠類:

public

class

addfactory

implements

ifactory

}

減法工廠類:

public

class

subfactory

implements

ifactory

}

乘法工廠類:

public

class

mulfactory

implements

ifactory

}

除法工廠類:

public

class

divfactory

implements

ifactory

}

操作抽象類:

public

abstract

class operation

public

void

setnumbera(double numbera)

public

double

getnumberb()

public

void

setnumberb(double numberb)

public

abstract

double

getresult();

}

加法操作類:

public

class

operationadd

extends

operation

}

減法操作類:

public

class

operationsub

extends

operation

}

乘法操作類:

public

class

operationmul

extends

operation

}

除法操作類:

public

class

operationdiv

extends

operation catch (exception e)

}double result = numbera/numberb;

return result;}}

客戶端**:

public

class client

}

和簡單工廠模式相比較,克服每次擴充套件時需要更改簡單工廠類的缺點(克服了簡單工廠類違反了開閉-原則的缺點),但是現在客戶端需要知道更多的類。之前客戶端只需要知道簡單工廠類、抽象產品類。現在需要知道抽象工廠類、具體工廠類、抽象產品類。多了乙個具體產品類。之前在簡單的判斷邏輯轉移到了客戶端中,由客戶端選擇例項化哪乙個工廠類 。

客戶端需要知道的類

抽象工廠類、具體工廠類、抽象產品類

通常建立型模式的設計是從工廠方法開始,當設計者發現需要更大的靈活性時,設計便會向其他設計模式演化。

工廠方法模式 工廠方法模式 二

工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...

工廠模式二 工廠方法模式

使用者只需要關心產品對應的工廠,不需要關心建立細節。例如貓和狗都屬於動物一類,都具有吃飯這個功能。先定義介面ianimal public inte ce ianimal實現介面ianimal介面cat類和dog類 public class cat implements ianimal public ...

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...