java設計模式之一 —— 工廠模式整理

最近把學過的設計模式重新整理一遍,工廠模式算是除單例之外最基礎的一個設計模式。

工廠模式

在簡單工廠模式中,一個工廠類處於對產品類實例化調用的中心位置上,它決定那一個產品類應當被實例化, 如同一個交通警察站在來往的車輛流中,決定放行那一個方向的車輛向那一個方向流動一樣。
先來看看它的組成:

     1) 工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在java中它往往由一個具體類實現。

     2) 抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。在java中由接口或者抽象類來實現。

     3) 具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現。

代碼整理如下:

此時,則是爲水果類聲明瞭一個接口,表現在代碼上:

1 public interface Fruit {
2 // 生長
3 void grow();
4 // 收穫
5 void harvest();
6 // 種植
7 void plant();
8 }
9
10

水果接口規定出所有的水果必須實現的接口,包括任何水果類必須具備的方法plant(),grow(),和harvest();

Apple類是水果類的一種,因此它實現了水果接口所聲明的所有方法。另處,由於蘋果是多年生植物,因此多出一個treeAge性質,描述蘋果的樹齡。代碼如下所示:
package fac;

public class Apple implements Fruit { // 通過implements實現接口Fruit
private int treeAge;

 public   void  grow() {
    log( " Apple is growing " );
} 

 public   void  harvest() {
    log( " Apple has been harvested " );
} 

 public   void  plant() {
    log( " Apple ha been planted " );
} 

 public   static   void  log(String msg) {
    System.out.println(msg);
} 

 public   int  getTreeAge() {
     return  treeAge;
} 

 public   void  setTreeAge( int  treeAge) {
     this .treeAge = treeAge;
} 

}

同理,葡萄 Grape:
package fac;

public class Grape implements Fruit{
private boolean seedless;
public void grow(){
log(“Grape is growing.”);
}

public void harvest(){
    log("Grape has been harvested");
}

public void plant(){
    log("Grape ha been planted");
}

public static void log(String msg){
    System.out.println(msg);
}

public boolean isSeedless() {
    return seedless;
}

public void setSeedless(boolean seedless) {
    this.seedless = seedless;
}

}

草莓 Stuawberry:
package fac;

public class Strawberry implements Fruit{
public void grow(){
log(“Strawberry is growing”);
}

public void harvest(){
    log("Strawberry has been harvested");
}

public void plant(){
    log("Strawberry has been planted");
}

public static void log(String msg){
    System.out.println(msg);
}

}

農場園丁也是系統的一部分,由一個類來代表,FruitGardener類,代碼如下:
package fac;

public class FruitGardener{
public static Fruit factory(String which)throws Exception{
if(which.equalsIgnoreCase(“apple”)){
return new Apple();
}else if(which.equalsIgnoreCase(“strawberry”)){
return new Strawberry();
}else if (which.equalsIgnoreCase(“grape”)){
return new Grape();
}else{
throw new Exception(“Bad fruit request”);
}
}
}
這時有人來果園玩,和園丁說,給我們介紹下你的水果吧。於是園丁:
package fac;

public class People {

public static void main(String[] args) throws Exception {
    FruitGardener fg=new FruitGardener();
    Fruit ap=fg.factory("Apple");
    ap.grow();
    Fruit gp=fg.factory("Grape");
    gp.plant();

    Fruit dd=fg.factory("ddd");//拋出Bad fruit request異常
}    

}

便於理解,再附上一張圖片:

這裏寫圖片描述






總結:工廠模式雖然爲基礎的一個設計模式,不過個人卻認爲並不意味着普遍。得按照具體情況而言是否適合用此設計模式。按照個人理解:工廠模式應該更適用於大項目(需要創建成百上千個對象),以此來達到統一管理對象的實例化的目的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章