簡單工廠與工廠模式原理及案例分析

2021-08-28 01:26:46 字數 3687 閱讀 9026

工廠方法的規範性定義描述為:工廠方法模式定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。

在學習工廠方法前,我們應該先了解簡單工廠這一種偽模式。之所以稱之為偽模式,是因為嚴格意義上講這並不算是一種模式,個人感覺更像是將某一功能抽象成了乙個功能函式。

程式設計的場景為:有乙個專門生產果凍的生產商,可以生產出蘋果、香蕉、橘子三種口味的果凍。如果現在該生產商被要求生產蘋果口味的果凍,用簡單工廠偽模式是如何編碼的呢?

首先,我們需要有果凍父類,並且根據不同口味的果凍定義出各種果凍的具體子類。這一層我稱之為產品層:

父類jelly表現為:

public abstract class jelly 

public void melt()

public void put()

public void cold()

public void box()

public string getname()

}

以下是三種口味果凍的子類:

this.pigment = "no";

}@override

public void put()

}public class bananajetty extends jelly

@override

public void put()

}public class orangejetty extends jelly

@override

public void put()}

產品層到此為止,接下來就需要工廠層來生產產品。這裡用jellycompany類來表示

public class jellycompany 

public jelly orderjelly(string type)

}

此時jellycompany類裡面的

******jettyfactory就是像抽象出來的功能函式。它的具體實現為: 

public class ******jettyfactory else if(type.equals("orangejetty"))else if(type.equals("bananajetty"))

return jelly;

}}

最後就是執行類******factorysimulator:

public class ******factorysimulator 

}

輸出結果為:

the jelly's pigment is no

melt the material

cold the material

put the jelly into boxes

但是與上面只是抽出功能函式的簡單工廠比較,工廠模式則更適於變化。現在如果該公司成立了乙個分公司:上海分公司(這裡預設該公司的總部在北京)。但是由於地域性飲食差異,這使得兩個不同地方的公司生產的果凍流程有一些差異:北京總公司生產的果凍,其中的果肉傾向於更多更大,而上海分公司的果凍則更傾向於多放糖。如果某客戶要求生產北京的蘋果果凍和上海的橘子果凍,那麼簡單工廠很明顯已經不適應這種多變化需要。這時候我們來研究一下工廠模式:

同樣的,先列出model層,果凍父類jelly為:

public abstract class jelly 

public void melt()

public void put()

public void cold()

public void box()

public string getname()

}

下面依次是上海分公司所能生產的三種果凍:

this.pigment = "no";

}@override

public void put()

}public class shanghaibananajelly extends jelly

@override

public void put()

}public class shanghaiorangejelly extends jelly

@override

public void put()}

北京總公司所能生產的三種果凍:

this.pigment = "no";

}@override

public void put()

}public class beijingbananajelly extends jelly

@override

public void put()

}public class beijingorangejelly extends jelly

@override

public void put()}

下面是工廠層:抽象父類jellycompany

public abstract class jellycompany 

abstract jelly createjelly(string type);

}

北京總公司實現子類與上海子公司實現子類

public class beijingjellycompany extends jellycompany else if(type.equals("orangejelly"))else if(type.equals("bananajelly"))else

return null;

}}public class shanghaijellycompany extends jellycompany else if(type.equals("orangejelly"))else if(type.equals("bananajelly"))else

return null;

}}

最後是執行類jellysimulator:

public class jellysimulator 

}

執行結果為:

the jelly's pigment is no

melt the material

cold the material

put the jelly into boxes

***************===

the jelly's name is shanghaiorangejetty

the jelly's fruitmaterial is orange

the jelly's pigment is no

melt the material

put the orange and lots of sugar

cold the material

put the jelly into boxes

shanghaijelly : shanghaiorangejetty

通過上面的兩個例子大家可以比較一下簡單工廠與工廠模式的區別:

簡單工廠更像是抽象出乙個功能函式,而工廠模式則是抽象父類定義好一系列完整流程,而具體生產什麼樣產品的例項化交給子類去做。就變化的適應性而言,工廠模式更為優秀。

工廠模式之簡單工廠案例

簡單工廠模式 首先建立控制台應用程式專案 1.建立product抽象產品類,將具體產品類公共的 進行抽象和提取後封裝在 該乙個抽象產品類中 public abstract class product 2.建立concreteproducta具體產品類,將需要建立的產品物件的相關 封裝到 該具體產品類...

工廠模式的簡單案例

案例 顧客到商店買電腦 1 首先,建立乙個電腦公有的介面 電腦介面 public inte ce icomputer 2 建立具體實體,實現公有的介面,這裡是兩個品牌電腦 蘋果電腦實現類 public class implements icomputer 聯想電腦實現類 public class l...

簡單工廠與工廠模式 Factory

簡單工廠並不是乙個 真正的 模式,可以把它當作一種程式設計習慣。它的最大優點在於工廠類中包含必要的邏輯判斷,根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴 工廠方法模式 定義了乙個建立物件的介面,但由於類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。要點 ...