首頁 > Java > java教程 > Java中的簡單工廠模式

Java中的簡單工廠模式

高洛峰
發布: 2016-12-15 14:08:43
原創
1701 人瀏覽過

舉兩個例子以快速明白Java中的簡單工廠模式:

女媧摶土造人
話說:「天地開闢,未有人民,女媧摶土為人。」女媧需要用土造出一個個的人,但在女媧造出人之前,人的觀念只存在於女媧的思想裡面。
女媧造人,這就是簡單工廠模式的應用。 

  首先,在這個造人的思想裡面,有幾個重要的角色:女媧本身、抽象的人的概念和女媧所造出的一個個具體的人。
  1.)女媧是一個工廠類,也就是簡單工廠模式的核心角色。

        2.)所休的一個個的人,包括張三,李四等。這些人便是簡單工廠模式裡面的具體產品角色
  3.)抽象的人是最早只存在於女媧的頭腦裡的一個想法,女媧按照這個想法造出的一個個具體的人,便都符合這個抽象的人的定義。換言之,這個抽象的想法規定了所有具體的人必須都有的介面(特徵或功能)
   其UML類圖出下所示:

Java中的簡單工廠模式

理解了上面的這些東西,再來理解下面的例子,對照理解,相信看完這篇文章,便對java簡單工廠模式有一個很好的理解:


有一個農場公司,專門向市場銷售各類水果,在這個系統裡需要描述下列水果:
     葡萄Grape
     草莓Stuawberry
        草莓Stuawberry
        草莓Stuawberry

     蘋果Apple

水果與其他植物不同,最終可以採摘食用,那麼一個自然的做法是建立一個各種水果都適用的接口,以便與其他農場裡的植物區分食用,那麼一個自然的做法是建立一個各種水果都適用的接口,以便與其他農場裡的植物區分Java中的簡單工廠模式此時,則是為水果類聲明了一個接口,表現在代碼上:

    public   interface  Fruit {
        // 生长 
          void  grow();
         // 收获 
          void  harvest();
         // 种植 
          void  plant();
   }
登入後複製

水果接口規定出所有的水果必須實現的接口,包括任何水果類必須具備的方法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");
        }
    }
}
登入後複製

(註:以上程式碼在JDK5.0,Myeclise3.2下編譯通過)

 


 類比兩個例子,園丁就相當於女媧,而水果就相當於具體的人,接口水果類就相當於存在於類女媧思想裡的人的抽象概念。

由以上兩個例子可得出,簡單工廠模式需由以下角色組成:

      介面

                                  且有了解以下兩個例子,以來看第三個例子:
注意對比以下三個實例的不同
實例1:

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异常
    }    

}
登入後複製

實例二:
package org.jzkangta.factorydemo01;
//定义接口
interface Car{
    public void run();
    public void stop();
}
//具体实现类
class Benz implements Car{
    public void run(){
        System.out.println("Benz开始启动了。。。。。");
    }
    public void stop(){
        System.out.println("Benz停车了。。。。。");
    }
}
//具体实现类
class Ford implements Car{
    public void run(){
        System.out.println("Ford开始启动了。。。");
    }
    public void stop(){
        System.out.println("Ford停车了。。。。");
    }
}
//工厂
class Factory{
    public static Car getCarInstance(){
        return new Ford();
    }
}
public class FactoryDemo01 {

    public static void main(String[] args) {
        Car c=Factory.getCarInstance();
        c.run();
        c.stop();

    }

}
登入後複製

實例三:
package fac;


//定义接口
interface Car{
    public void run();
    public void stop();
}
//具体实现类
class Benz implements Car{
    public void run(){
        System.out.println("Benz开始启动了。。。。。");
    }
    public void stop(){
        System.out.println("Benz停车了。。。。。");
    }
}

class Ford implements Car{
    public void run(){
        System.out.println("Ford开始启动了。。。");
    }
    public void stop(){
        System.out.println("Ford停车了。。。。");
    }
}
//工厂
class Factory{
    public static Car getCarInstance(String type){
        Car c=null;
        if("Benz".equals(type)){
            c=new Benz();
        }
        if("Ford".equals(type)){
            c=new Ford();
        }
        return c;
    }
}


public class FactoryDemo02 {

    public static void main(String[] args) {
        Car c=Factory.getCarInstance("Benz");
        if(c!=null){
            c.run();
            c.stop();
        }else{
            System.out.println("造不了这种汽车。。。");
        }
        

    }

}
登入後複製

對比三個實例:
實例一,雖然實作了簡單工廠,但每每一個例子次只能得到一種汽車,如果我們想換一種,就得修改工廠,太不方便,而實例二則改變了這種情況,便得我們可以按照我們的需要更換汽車,但我們所更換的汽車必須是實現類別中有的,如果我們想要增加一種汽車的時候,我們還是得更改工廠,透過改進,實例三利用反射機制,得到汽車類型,這樣當我們需要增加一種新的汽車時,就無需要再修改工廠,而只需要增加要實現的類別即可。也就是說要增加什麼樣的汽車直接增加這個汽車的類別即可,而無需改變工廠。從而達到了工廠分離的效果。 


更多Java中的簡單工廠模式相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板