乙個栗子:
我喜歡吃麵條,抽象
乙個麵條基類
,(介面也可以),這是產品的抽象類。
public abstract class inoodles
}
程式設計師加班必備也要吃泡麵(具體的產品類):
public class paonoodles extends inoodles
還有我最愛吃的家鄉的幹扣面(具體的產品類):
public class gankounoodles extends inoodles
}
準備工作做完了,我們來到一家「簡單麵館」(簡單工廠類),選單如下:
public class ******noodlesfactory }}
簡單麵館就提供三種麵條(產品),你說你要啥,他就給你啥。這裡我點了乙份幹扣面:
/**
* 簡單工廠模式
*/ inoodles noodles = ******noodlesfactory.createnoodles(******noodlesfactory.type_gk);
noodles.desc();
輸出:
還是家裡的幹扣面好吃 6塊一碗
1 它是乙個具體的類,非介面 抽象類。有乙個重要的create()方法,利用if或者 switch建立產品並返回。
2 create()方法通常是靜態的,所以也稱之為靜態工廠。
1 擴充套件性差(我想增加一種麵條,除了新增乙個麵條產品類,還需要修改工廠類方法)
2 不同的產品需要不同額外引數的時候 不支援。
簡單工廠例項
package demo1;
public abstract class operation
public void setnumberb(double numberb)
public double getnumbera()
public double getnumberb()
public double getresult() }
package demo1;
public class operationadd extends operation }
package demo1;
public class operationsub extends operation }
package demo1;
public class operationmul extends operation }
package demo1;
public class operationdiv extends operation }
package demo1;
public class operationfactory
return oper; }
} package demo1;
public class demo1
}
1.1 定義
工廠方法模式,又稱工廠模式、多型工廠模式和虛擬構造器模式,通過定義工廠父類負責定義建立物件的公共介面,而子類則負責生成具體的物件。
1.2 主要作用
將類的例項化(具體產品的建立)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應該例項化(建立)哪乙個類。
1.3 解決的問題
工廠一旦需要生產新產品就需要修改工廠類的方法邏輯,違背了「開放 - 關閉原則
即簡單工廠模式的缺點2. 模式原理之所以可以解決簡單工廠的問題,是因為工廠方法模式把具體產品的建立推遲到工廠類的子類(具體工廠)中,此時工廠類不再負責所有產品的建立,而只是給出具體工廠必須實現的介面,這樣工廠方法模式在新增新產品的時候就不修改工廠類邏輯而是新增新的工廠子類,符合開放封閉原則,克服了簡單工廠模式中缺點
2.1 uml類圖
2.2 模式組成
組成(角色)
關係作用
抽象產品(product)
具體產品的父類
描述具體產品的公共介面
具體產品(concrete product)
抽象產品的子類;工廠類建立的目標類
描述生產的具體產品
抽象工廠(creator)
具體工廠的父類
描述具體工廠的公共介面
具體工廠(concrete creator)
抽象工廠的子類;被外界呼叫
描述具體工廠;實現factorymethod工廠方法建立產品的例項
2.3 使用步驟
步驟1:建立抽象工廠類,定義具體工廠的公共介面;
步驟2:建立抽象產品類,定義具體產品的公共介面;
步驟3:建立具體產品類(繼承抽象產品類) & 定義生產的具體產品;
步驟4:建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品例項的方法;
步驟5:外界通過呼叫具體工廠類的方法,從而建立不同具體產品類的例項
3. 例項講解
接下來我用乙個例項來對工廠方法模式進行更深一步的介紹。
3.1 例項概況
3.2 使用步驟
步驟1:建立抽象工廠類,定義具體工廠的公共介面
abstract class factory
步驟2:建立抽象產品類,定義具體產品的公共介面;
abstract class product
步驟3:建立具體產品類(繼承抽象產品類), 定義生產的具體產品;
//具體產品a類
class producta extends product
}//具體產品b類
class productb extends product
}
步驟4:建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品例項的方法;
//工廠a類 - 生產a類產品
class factorya extends factory
}//工廠b類 - 生產b類產品
class factoryb extends factory
}
步驟5:外界通過呼叫具體工廠類的方法,從而建立不同具體產品類的例項
//生產工作流程
public class factorypattern
}
結果:
生產出了產品a
生產出了產品c
4. 優點
總結:工廠模式可以說是簡單工廠模式的進一步抽象和拓展,在保留了簡單工廠的封裝優點的同時,讓擴充套件變得簡單,讓繼承變得可行,增加了多型性的體現。
5. 缺點
6. 應用場景
在了解了優缺點後,我總結了工廠方法模式的應用場景:
抽象工廠模式有乙個問題就是,類的建立依賴工廠類,也就是說,如果想要拓展程式,必須對工廠類進行修改,這違背了開閉原則,所以,從設計角度考慮,有一定的問題,如何解決?就用到抽象工廠模式,建立多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的**。
**示例:
抽象工廠模式與工廠方法模式的區別
抽象工廠模式是工廠方法模式的公升級版本,他用來建立一組相關或者相互依賴的物件。他與工廠方法模式的區別就在於,工廠方法模式針對的是乙個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構。在程式設計中,通常乙個產品結構,表現為乙個介面或者抽象類,也就是說,工廠方法模式提供的所有產品都是衍生自同乙個介面或抽象類,而抽象工廠模式所提供的產品則是衍生自不同的介面或抽象類。
在抽象工廠模式中,有乙個產品族的概念:所謂的產品族,是指位於不同產品等級結構中功能相關聯的產品組成的家族。抽象工廠模式所提供的一系列產品就組成乙個產品族;而工廠方法提供的一系列產品稱為乙個等級結構。我們依然拿生產汽車的例子來說明他們之間的區別。
java設計模式 三種工廠模式
工廠模式提供建立物件的介面。工廠模式分為三類 簡單工廠模式 factory 工廠方法模式 factory method 和抽象工廠模式 abstract factory gof在 設計模式 中將工廠模式分為兩類 工廠方法模式 factory method 和抽象工廠模式 abstract facto...
JAVA工廠設計模式三種形式
工廠模式 主要用來例項化有共同介面的類,工廠模式可以動態決定應該例項化那乙個類。工廠模式的形態 工廠模式主要用一下幾種形態 1 簡單工廠 2 工廠方法 3 抽象工廠 簡單工廠 又叫靜態工廠 是工廠模式三中狀態中結構最為簡單的。主要有乙個靜態方法,用來接受引數,並根據引數來決定返回實現同一介面的不同類...
Java三種設計模式
私有功能 private animalfactory 工廠改進 提供貓和狗這兩種動物 public static animal createanimal string type else if cat equals type else 2,工廠方法模式 需要提供抽象類,具體的類,乙個工廠介面,以及具...