1.概念
工廠模式就是把客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何建立及如何向客戶端提供。
工廠模式分為簡單工廠模式、工廠方法模式和抽象工廠模式三類,依次逐步抽象,並具有一般性。其中簡單工廠模式是工廠方法模式的一種特例。『
2.設計原則
6.要依賴抽象,不要依賴具體類。(依賴倒置原則)
3.舉例子
①簡單工廠模式用的還是比較多的,且容易理解。相當於乙個工廠加工好乙個物件給客戶。
有乙個工廠是造汽車的,現在主要造寶馬320、460、600和860這幾款。那麼首相想到的是寶馬320是個物件,寶馬460是個物件,。。。他們都是寶馬車,也就是說寶馬系列的大框架差不多,那麼我們可以定義乙個寶馬抽象類。然後分別讓320、460、600和860分別繼承該寶馬。
/**
* 簡單工廠
*/public class ******factory
public void show()
} class bmw320 extends bmw
} class bmw460 extends bmw
} class bmw600 extends bmw
} class bmw860 extends bmw
} //定義乙個簡單工廠,此處因為是內部類裡有靜態方法所以需要static修飾靜態內部類可建立靜態方法,如非內部類,則無需變成靜態類
//簡單工廠模式又稱靜態工廠方法模式
static class factory
return null;
} }//測試,定義乙個工廠,然後客戶想工廠訂購了一輛320,然後顧客更換新車系列460。。。。
public static void main(string args)
}
執行測試用例後,得到下圖:
②工廠方法模式 定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。
現在有乙個工廠,他即生產收音機,也生產電視機,那麼這個時候工廠採用工廠方法。分別讓收音機的子工廠生產收音機,電視機的子工廠生產電視機
/**
* 工廠方法:
* 在以下情況下,適用於工廠方法模式:
* (1) 當乙個類不知道它所必須建立的物件的類的時候。
* (2) 當乙個類希望由它的子類來指定它所建立的物件的時候。
* (3) 當類將建立物件的職責委託給多個幫助子類中的某乙個,並且你希望將哪乙個幫助子類是**者這一資訊區域性化的時候。
*/public class factorymethod
//定義具體的收音機產品
class radio implements product
public void describe()
} //定義具體的電視機產品
class tv implements product
public void describe()
} //定義建立物件的介面
inte***ce factory
//定義乙個專門生產電視的子工廠
class tvfactory implements factory
} //定義乙個專門生產收音機的子工廠
class radiofactory implements factory
} //測試,電視機工廠生產的是電視機,收音機工廠生產的是收音機
public static void main(string args)
public static void test(factory factory)
}
執行結果:
這時候也可以結合反射等方法,來更加的靈活建立。
③抽象工廠模式 提供乙個介面,用於建立相關或依賴物件的家族,而不需要明確指定具體類。
抽象工廠模式和工廠方法模式的區別就在於需要建立物件的複雜程度上。而且抽象工廠模式是三個裡面最為抽象、最具一般性的。
現在有兩個品牌,乙個是蘋果,乙個是三星。蘋果推出了手機和筆記本,三星也推出了手機和筆記本。現在有人就是只賣乙個品牌的東西,那麼這個時候滿足抽象模式的設計點即多個產品族裡系統只消費其中乙個產品族。**設計,從產品的角度來看,可以定義手機乙個產品介面和筆記本乙個產品介面,從工廠這邊看,乙個蘋果廠家和三星廠家,同時設計蘋果專櫃和三星專櫃供使用者購買。
/**
* 抽象工廠模式 提供乙個介面,用於建立相關或依賴物件的家族,而不需要明確指定具體類
* 抽象工廠:
* (1) 乙個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,這對於所有形態的工廠模式都是重要的。
* (2) 這個系統有多於乙個的產品族,而系統只消費其中某一產品族。
* (3) 同屬於同乙個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
* (4) 系統提供乙個產品類的庫,所有的產品以同樣的介面出現,從而使客戶端不依賴於實現。
*/public class abstractfactory
inte***ce notebook
class iphone implements phone
} class samphone implements phone
} class mac implements notebook
} class samnotebook implements notebook
} //定義工廠,從工廠角度分析
public iphone createiphone();
public mac createmac();
} inte***ce samsung
@override
public iphone createiphone()
@override
public mac createmac()
} class samsungshoppe implements samsung
@override
public samnotebook createsamnotebook()
} //測試
public static void main(string args)
}
執行結果如下:
4.總結
應用場景
工廠方法:
在以下情況下,適用於工廠方法模式:
(1) 當乙個類不知道它所必須建立的物件的類的時候。
(2) 當乙個類希望由它的子類來指定它所建立的物件的時候。
(3) 當類將建立物件的職責委託給多個幫助子類中的某乙個,並且你希望將哪乙個幫助子類是**者這一資訊區域性化的時候。
抽象工廠:
(1) 乙個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,這對於所有形態的工廠模式都是重要的。
(2) 這個系統有多於乙個的產品族,而系統只消費其中某一產品族。
(3) 同屬於同乙個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
(4) 系統提供乙個產品類的庫,所有的產品以同樣的介面出現,從而使客戶端不依賴於實現。
三種工廠模式應用場景略有不同,可以根據實際需要來設計,也可以靈活定義工廠型別。加上反射機制,可以減少工廠的例項化。
更多參考
對工廠模式的理解
工廠模式主要解決的問題在於降低 耦合度,將大量對物件的初始化 抽象為可復用的方法 例如對資料庫的連線,可能要使用mysql,可能要使用oracel,可能要使用sqlite,可能這三者要同時使用。使用在業務體中現場例項化的方法的話,乙個過程不嫌複雜,兩個過程也不嫌複雜,如果有多個相同過程時,對具體物件...
我所理解的「工廠模式」
工廠模式,我更願意叫它是 父母模式 或者 親人模式 假設我們都是小孩子,我們需要 食物 衣服 玩具。如果我向賣食物的老闆,賣衣服的老闆,賣玩具的老闆借的話,我將欠他們東西。耦合 後果是 第一,他們的兒子我不敢打了!安全性的角度 第二,如果某位老闆搬家了,我必須自己去找其他老闆。要知道我只是個小孩,這...
對抽象工廠模式的理解
抽象工廠模式是指在父子類間要發生一定的分離變化,當然這裡肯定是使用抽象類,抽象類作為父子類的乙個旋接擴充套件類。它是在乙個物件的另乙個維度上對物件進行擴充套件,你比如說人有黑人,白人,黃人 但是人還有男人 女人。但是在工廠的抽象類中定義的工廠方法盡量寫全,你比如說這裡的男人,女人,這裡在這個維度上就...