C 設計模式一一工廠方法模式

2021-09-13 04:05:30 字數 2050 閱讀 9221

前面我們講述了簡單工廠模式,提到其缺點是系統難以擴充套件,一旦新增新產品就不得不修改簡單工廠方法,這樣造成簡單工廠方法的實現邏輯過於複雜。本節介紹的工廠方法模式可以解決這個問題。

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

與簡單工廠一致,我們先構建運算類,然後各運運算元類繼承該基類

public class operation

public double numberb

public virtual double getresult( ) }

public class operationadd : operation

}public class operationsub : operation

}public class operationmul : operation

}public class operationdiv : operation

}

之前簡單工廠模式的做法是:將所有的負責運算的物件集中在一起,構成乙個生產運算法則的類,然後通過該類去實現各種運算,如下所示:

public class operationfactory

return oper;

}}

static void main( string[ ] args )

= ", oper.numbera, str_oper, oper.numberb, result );

console.read( );

}

這種運算方式的邏輯結構圖如下:

而工廠方法模式,它的實現是把具體產品的建立推遲到子類中,此時工廠類不再負責所有產品的建立,而只是給出具體工廠必須實現的介面,這樣工廠方法模式就可以允許系統不修改工廠類邏輯的情況下來新增新產品,這樣也就克服了簡單工廠模式中缺點。

如下所示,先構建乙個工廠介面:

//先構建乙個工廠介面

inte***ce ifactory

然後根據運算種類各建乙個具體工廠去實現這個介面:

public class addfactory : ifactory

}public class subfactory : ifactory

}public class mulfactory : ifactory

}public class divfactory : ifactory

}

最後,各運算工廠實現自己的運算方法:

static void main( string[ ] args )

= ", oper.numbera, "+", oper.numberb, result );

console.read( );

}

實現結構圖:

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

使用工廠方法實現的系統,如果系統需要新增新產品時,我們可以利用多型性來完成系統的擴充套件,對於抽象工廠類和具體工廠中的**都不需要做任何改動。

工廠方法模式是為了克服簡單工廠模式的缺點而設計出來的,簡單工廠模式的工廠類隨著產品類的增加需要增加額外的**),而工廠方法模式每個具體工廠類只完成單個例項的建立,所以它具有很好的可擴充套件性。但是在現實生活中,乙個工廠只建立單個產品這樣的例子很少,因為現在的工廠都多元化了,乙個工廠建立一系列的產品,如果我們要設計這樣的系統時,工廠方法模式顯然在這裡不適用,不過抽象工廠模式可以很好地解決一系列產品建立的問題。我們在下一章節進行介紹。

C 設計模式 工廠方法模式

問題描述 之前講到了c 設計模式 簡單工廠模式,由於簡單工廠模式的侷限性,比如 工廠現在能生產producta productb和productc三種產品了,此時,需要增加生產productd產品 那麼,首先是不是需要在產品列舉型別中新增新的產品型別標識,然後,修改factory類中的switch結...

C 設計模式 工廠方法模式

問題描述 之前講到了c 設計模式 簡單工廠模式,由於簡單工廠模式的侷限性,比如 工廠現在能生產producta productb和productc三種產品了,此時,需要增加生產productd產品 那麼,首先是不是需要在產品列舉型別中新增新的產品型別標識,然後,修改factory類中的switch結...

C 設計模式 工廠方法模式

abstract class product class concreteproducta product class concreteproductb product abstract class factory class concreteafactory factory class concr...