今天說說工廠模式吧,以前就想寫下的,但是懶啊,也怪不得自己對自己技術失望了,哎。
工廠模式呢,簡單的說工廠模式不是乙個模式,而是一系列模式,它相當於是乙個統稱吧,工廠模式包括:工廠方法模式、簡單工廠模式、抽象工廠模式。不過這個也不是絕對的吧,因為有些把簡單工廠模式規劃到工廠方法模式裡面了,因為它是工廠方法模式的乙個弱化版本,簡單工廠模式也有的稱為靜態工廠模式。
先舉個例子來說明三者的大致區別的,具體看後面的具體分析:
假設我現在需要生產汽車(媽的,怎麼都是汽車,好多人講設計模式都是用汽車!我也沒法啊~情不自禁啊,誰讓汽車是大家都想要的啊,泡妹和裝逼的神器啊,咳,正事,主要是汽車的分類好理解些,所以都用汽車)
1.假設生產汽車,我們只生產蘭博基尼,所以我們只需要乙個工廠就行了,這就是簡單工廠模式;
2.現在需要生產兩種汽車:蘭博基尼和法拉利,假設兩種汽車生產所需零件都一樣,那麼此時就只需要兩個工廠,也就是多工廠方法模式,跟簡單工廠的區別就是簡單工廠只有乙個工廠,所以也有說法把簡單工廠劃為工廠方法模式,因為它是乙個工廠方法模式的弱化版,單工廠版;
3.那麼問題來了,如果蘭博基尼和法拉利生產所需零件不一樣,輪胎啊,引擎啊之類不一樣,那麼此時我們就需要多分出一層了(零件層),因為之前蘭博基尼和法拉利生產零件一樣,所以不需要分直接一套生產就行,那麼現在我們需要生產不同的零件,然後不同的零件合成不同的汽車,不同的汽車又要不同的工廠,這就是抽象工廠模式。
上述工廠模式需要三個模組:
1.抽象產品類;(抽象汽車)
2.具體產品類;(具體汽車類:蘭博基尼和法拉利)
3.抽象工廠類;(抽象工廠)
4.具體工廠類;(具體工廠類:蘭博基尼工廠和法拉利工廠)
首先來舉例說明工廠方法模式(包括簡單工廠模式):
抽象產品類:
package factorypattern;
/** * 抽象產品類
*/public
abstract
class
product
具體產品類:
/**
* 產品a,蘭博基尼
*/public
class
producta
extends
product
/** * 產品b,法拉利
*/public
class
productb
extends
product
}
抽象工廠類:
/**
*抽象工廠類
*/public
abstract
class
factory
具體工廠類:
/**
* 工廠類a,具體工廠,生產蘭博基尼的工廠
*/public
class
factorya
extends
factory
}/**
* 工廠類b,具體工廠,生產法拉利的工廠
*/public
class
factoryb
extends
factory
}
生產汽車:
public
class createproduct
}
上述我們構造了兩種工廠生產兩種汽車,這就是多工廠方法模式,可以看到我們具體化了兩種工廠。如果覺得多個工廠寫起來麻煩,那麼可以用反射來獲取類來獲取對應的工廠,如下(更改抽象工廠類和具體工廠類):
/**
*抽象工廠類
*/public
abstract
class
factory
//具體工廠類,通過傳入型別進行建立
public
class
myfactory
extends
factory catch (instantiationexception | illegalacces***ception| classnotfoundexception e)
return (t)p;
}}//生產汽車
public
class
createproduct
}
上述都是兩個工廠生產兩種汽車,假設我們只需要乙個工廠,生產一種汽車,那麼我們就可以簡化下了(不需要抽象工廠類,直接寫工廠類生產產品):
/**
* 省掉抽象工廠類,因為我們只需要乙個工廠,寫抽象工廠類是因為工廠會有多個而且不同,既然只有乙個工廠就可以省略
*/public
class
factory
}
像上述這種方式只有乙個工廠,省略了抽象工廠,這種就是所謂的簡單工廠模式。
那些複雜的抽象工廠方法模式又是怎樣的呢,之前的是因為蘭博基尼和法拉利零件啥都一樣,所以只需要乙個抽象產品類就行了,那麼假設蘭博基尼和法拉利所用零件不一樣咋辦,那就需要用抽象工廠模式了。所以我們可以理解為:
工廠方法模式:單抽象產品;
抽象工廠方法模式:多抽象產品;
示例(假設蘭博基尼需要普通輪胎+高階引擎,而法拉利需要高階輪胎+普通引擎):
抽象產品類:
//抽象產品類a,輪胎
public
abstract
inte***ce producta
//抽象產品類b,引擎
public
abstract
inte***ce productb
具體產品類:
//具體產品類,普通輪胎
public
class
proaimpone
implements
producta
}//具體產品類,高階輪胎
public
class
proaimptwo
implements
producta
}//具體產品類,普通引擎
public
class
probimpone
implements
productb
}//具體產品類,高階引擎
public
class
probimptwo
implements
productb
}
抽象工廠類:
//抽象工廠類,裡面方法是製造用的零件:輪胎和引擎
public
abstract
inte***ce factory
具體工廠類:
//具體工廠類,法拉利
public
class
facfl
implements
factory
@override
public productb createb()
}//具體工廠類,蘭博基尼
public
class
faclb
implements
factory
@override
public productb createb()
}
如上所示:抽象產品類有多個,其他用法跟工廠方法模式類似,僅僅區別是在抽象產品不是單一的。可能我說的大家看得不是很明白,具體還得看例子,多看幾遍就能明白其中的區別了,本人水平有限,不當之處還請指教哈~ java設計模式之工廠模式
工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的資料生成一組類中某乙個類的例項,通常這一組類有乙個公共的抽象父類或者是介面並且實現了相同的方法,但是這些方法針對不同的資料進行了不同的操作。首先需要定義乙個父類或者介面,該類的子類通過不同的方法實現了父類中的方法。然後需要定義乙個工...
java設計模式之工廠模式
1 只要方法裡面控制產生物件的方法,就可稱為工廠相關方法。2 單例 多例。3 簡單工廠 例子 交通工具 多種交通工具 多種交通工具不同的生產過程 4 介面抽象類使用 一般乙個特性使用介面 會飛的 大概能定義為乙個物體使用抽象類 由於類的多繼承性,建議多用介面。5 抽象工廠 換掉一些列的產品,擴充套件...
java設計模式之工廠模式
工廠模式包括工廠方法模式和抽象工廠模式兩種。實際是將介面的例項建立交給乙個工廠類來做。1.工廠方法模式 又包括普通工廠模式 多方法工廠模式 靜態工廠模式三種設計方式。例如 介面 public inte ce father 實現類public class child1 implements fathe...