(一)簡單工廠模式
(一)簡單工廠模式
作者:林子時間:2014年8月
出處:http://blog.csdn.net/u013011841
聲明:歡迎指出錯誤
1、為什麽學習設計模式?
設計模式(Design pattern)是一套被重復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更easy被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的。設計模式使代碼編制真正project化。設計模式是軟件project的基石脈絡。如同大廈的結構一樣。
2、為什麽第一個學習簡單工廠?
簡單工廠(Simple Factory)是類的創建者,又叫靜態工廠方法(Static Factory Method)。簡單工廠是由一個工廠對象決定創建出納一種產品類的實例。
第一個學習簡單工廠是由於這是最主要的創建模式。學習好簡單工廠有利於我們學好工廠方法。
3、簡單工廠的引進
我們以農場公司為樣例,專門向市場銷售各類水果。在這個系統裏面須要描寫敘述下列水果
- 葡萄Grape
- 草莓Strawberry
- 蘋果Apple
水果和其它的植物有非常大的不同。水果終於是能夠食用的。
那麽一個自然的做法就是就是建立一個各種水果都適用的接口,以便和農場裏的其它植物區分開來。
水果的接口(interface)規定全部的水果必須實現的接口,包含不論什麽水果必須具備的方法。
PS: 不知道什麽是接口的去看Java教材,接口就是Fruit的抽象方法,類似C++的虛函數
水果接口的源碼:
Public interface Fruit { //生長 void grow(); //收獲 void harvest(); //種植 void plant(); }
描寫敘述蘋果類的類圖例如以下
Apple類是水果類的一種,因此它實現了水果接口所聲明的全部方法。另外,因為蘋果是多年生的植物。因此多出一個treeAge性質,用來描寫敘述蘋果樹的年齡。
public class Apple implements Fruit { private int treeAge; //生長 public void grow() { log(“Apple if growing...”); } //收獲 public void harvest() { log(“Apple has been harvest.”) } //種植 public void plant() { log(“Apple has been planted.”) } //輔助方法 public static log(String msg) { System.out.println(msg); } //樹齡取值方法 public int getTreeAge() { return treeAge; } //樹齡的賦值方法 public int setTreeAge(int treeAge) { this.treeAge=treeAge; } }
葡萄和草莓類和蘋果類類似,這裏就不一一給出了。
農場的園丁(在這裏作為簡單工廠)也是系統的一部分。自然要由一個合適的類來代表。這個類就是FruitGardener類,其結構如圖所看到的
FruitGardener會依據client的要求,創建出不同的水果對象,如蘋果(Apple).
園丁類的代碼例如以下
public class FruitGardener { //簡單工廠 public static Fruit factory(String which) { if(which.equalsIgnoreCase(“Apple”)) { return new Apple; } if(which.equalsIgnoreCase(“strawberry”)) { return new strawberry; } if(which.equalsIgnoreCase(“grape”)) { return new grape; } } }
4、簡單工廠的結構
簡單工廠涉及到工廠角色、抽象產品角色和詳細產品角色等三個角色:
- 工廠類(Creator):擔任這個角色的是簡單工廠的核心,含有與應用緊密相關的邏輯。工廠類在調用下創建產品對象。
- 抽象產品(Product):擔任這個角色的類是由簡單工廠所創建的對象的父類。或者他們擁有共同的接口。
- 詳細產品(Concrete Product):簡單工廠所創建的不論什麽對象都是這個角色的實例。
工廠類源碼
public class Creator { //簡單工廠 public static Product factory() { return new ConcreteProduct(); } }
抽象產品源碼
public interface Product { }
詳細產品
public class ConcreteProduct implements Product { public ConcreteProduct(){} }
(一)簡單工廠模式