工廠方法模式和抽象工廠模式


 

前言:

    工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統可以說是隨處可見。因為工廠模式就相當於創建實例對象的new,我們經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,所以以后new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統帶來更大的可擴展性和盡量少的修改量。
 
  而工廠模式有根據抽象程度不同分為簡單工廠,工廠方法和抽象工廠;借用網上一大神的概括,如下:

  看了網絡上很多關於設計模式的方法,有的模式看起來相似,但本質還是區別很大的.像簡單工廠,工廠方法和抽象工廠就有很明顯的區別.

  有一個比較好理解的例子,在這跟大家介紹下:

  1.如果一個后花園只種蔬菜類,那么就用簡單工廠就可以了.

  2.如果后花園蔬菜品種繁多.得用工廠方法才可以,把共有的東西抽象出來.

  3.如果要擴大后花園的規模,比如一個在北方,一個在南方,這樣工廠方法就無法實現了,就應當用抽象工廠,把各種各樣的植物,又組成一個后花園.

  所以我個人認為,簡單工廠是一個工廠只生產一類的產品,面對的是具體的類,工廠方法是可以生產不同的產品,把公共的方法抽象出來,然后進行創建各種各樣的產品.抽象工廠把幾種產品划出共同的東西,把相互依賴的對象抽象出來,只要實現這些接口就可以得到不同的產品.

1、工廠方法模式(Factory Method)

 

1.1、普通工廠模式(靜態工廠)就是建立一個工廠類,對實現了同一接口的一些類根據用戶需求進行實例的創建。首先看下關系圖:

    

 概念這些比較繞,直接舉例吧!(我們舉個手機工廠的子)

 第一步:創建一個手機接口,定義一個生產手機的公共方法;

  

public interface MobilePhone {
    
  public void production ();
  
}

第二步:創建具體實現類

 

public class HuaWei implements MobilePhone{

    public void production() {
        // TODO Auto-generated method stub
        System.out.println("華為手機生產");
    }

}



public class Vivo implements MobilePhone{

    public void production() {
    
        System.out.println("vivo手機生產");
    }

}

 

第三步:創建工廠類

public class MobilePhoneFactory {

    public MobilePhone  produceFactory(String name){
        
        if ("HuaWei".equals(name)) {  
            return new HuaWei();  
        } else if ("Vivo".equals(name)) {  
            return new Vivo();  
        } else {  
            System.out.println("請輸入正確的類型!");  
            return null;  
        }  
        
    }
}

最后測試一下

 

public class Test {
public static void main(String[] args) {
    MobilePhoneFactory m=new MobilePhoneFactory();
    MobilePhone mobilePhone=m.produceFactory("Vivo");
    mobilePhone.production();
}
}

 

輸出:vivo手機生產

總結:簡單工廠相當於一個模子,根據傳入的參數通過一些自己的邏輯判斷;生產出不同類型的相應的產品、對象。但這種模式局限性很大,一但參數錯誤,就不能做出正確的操作,而且新增一些產品就要更改工廠類;所以這種模式一般用於比較簡單的場景;

1.2、多個工廠方法模式

 

  多個工廠方法模式是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象,而且新增一些產品就要更改工廠類;而多個工廠方法模式是提供多個工廠方法,分別創建對象。

  

 

  只要將上面的工廠做下修改即可;如下:

 

public abstract class Factory {
    
 public abstract MobilePhone getMobilePhone();
}


public class HuaWeiFactory extends Factory{

    @Override
    public MobilePhone getMobilePhone() {
        // TODO Auto-generated method stub
        return new HuaWei();
    }

}



public class VivoFactory extends Factory{

    @Override
    public MobilePhone getMobilePhone() {
        // TODO Auto-generated method stub
        return new Vivo();
    }

}

 

 

 

測試如下:


public class Test {
public static void main(String[] args) {
    Factory m=new HuaWeiFactory();
    MobilePhone mobilePhone=m.getMobilePhone();
    mobilePhone.production();
}
}

輸出:華為手機生產

 
2:抽象工廠
 為創建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類;如下圖:

還是用手機的例子,但現在生產手機的同時還要生產配套的充電器;增加代碼如下:

 

public interface MobilepHoneAccessories {
     public void production ();
}



public class VivoTheCharger implements MobilepHoneAccessories{

    public void production() {
        // TODO Auto-generated method stub
        System.out.println("vivo充電器生產");
    }

}


public class HuaWeiTheCharger  implements MobilepHoneAccessories{

    public void production() {
        System.out.println("華為充電器生產");
        
    }

}

 

工廠修改如下:

public abstract class Factory {
//手機生產    
 public abstract MobilePhone getMobilePhone();
 //充電器生產
 public abstract MobilepHoneAccessories getThrCharger();
}



public class HuaWeiFactory extends Factory{

    @Override
    public MobilePhone getMobilePhone() {
        // TODO Auto-generated method stub
        return new HuaWei();
    }

    @Override
    public MobilepHoneAccessories getThrCharger() {
        // TODO Auto-generated method stub
        return new HuaWeiTheCharger();
    }

}


public class VivoFactory extends Factory{

    @Override
    public MobilePhone getMobilePhone() {
        // TODO Auto-generated method stub
        return new Vivo();
    }

    @Override
    public MobilepHoneAccessories getThrCharger() {
        // TODO Auto-generated method stub
        return  new VivoTheCharger();
    }

}

測試如下:

public class Test {
public static void main(String[] args) {
    Factory m=new HuaWeiFactory();
    MobilePhone mobilePhone=m.getMobilePhone();
    MobilepHoneAccessories mha=m.getThrCharger();
    mobilePhone.production();
    mha.production();
}
}

輸出:華為手機生產
  華為充電器生產

總結:

  簡單工廠 : 用來生產同一等級結構中的任意產品。(對於增加新的產品,無能為力)

  工廠方法 :用來生產同一等級結構中的固定產品。(支持增加任意產品)  
  抽象工廠 :用來生產不同產品族的全部產品。(對於增加新的產品,無能為力;支持增加產品族)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM