設計模式----工廠設計模式

liuxuhui發表於2021-09-09

工廠設計模式概念

  • 什麼是工廠設計模式

工廠設計模式,理解為用來生產物件的,Java是物件導向程式語言,Java語言中,物件都是需要建立的,物件都是透過關鍵字new例項化,試想,如果在程式中需要例項化10個物件,遇到需求變更,例項化的物件需要改變,那例項化物件的10處地方都需要修改;這個時候可以設計為工廠模式,如果獲取物件不是直接new例項化的,而是透過工廠獲取物件,那麼,物件有修改的時候,只需要透過修改工廠中的物件,就可以將所有的物件修改,所有得出工廠模式的最大優點是:解耦

  • 工廠設計模式分類
  1. 簡單工廠(不屬於23設計及模式)
  2. 工廠方法
  3. 抽象工廠

一、簡單工廠

  • 概述

簡單工廠不屬於23種設計模式,更像是對程式碼結構的一種改造,將例項化物件的程式碼進行抽取,抽取成工廠的類,在程式程式碼種需要用到該物件的時候,從工廠種獲取即可,如果對該例項有修改,也只需要修改簡單工廠中例項化物件即可。

  • 舉例

比如現在有一個介面Phone,定義生產手機;這個介面有兩個實現類,分別是XiaoMi和HuaWei;如果需求要例項化小米或者華為手機,直接用類進行例項化物件即可;假設現在程式中有100處例項化了小米手機,還有100處例項化了華為手機,維護的時候需要依次去修改;這個時候可以考慮簡單工廠的方式,將例項化手機物件的操作交給工廠,只需要告訴工廠需求,就能夠得到相應的物件。

  • 圖示
    圖片描述

  • 程式碼事例

1)定義Phone介面

public interface Phone {
    //建立手機的方法
    public String getPhone();
}

2)定義華為手機類,實現Phone介面

public class HuaWei implements Phone{
    //重寫建立電話的方法
    @Override
    public String getPhone() {
        return "建立一個華為手機物件";
    }
}

3)定義小米手機類,實現Phone介面

public class XiaoMi implements Phone{
    //重寫建立手機的方法
    @Override
    public String getPhone() {
        return "建立一個小米手機物件";
    }
}
  • 上面一個Phone介面和兩個實現類,關係類圖如下:

圖片描述

  • 編寫一個簡單工廠類,提供建立物件的方法
//定義簡單工廠類
public class SimpleFactory {
    //建立手機的方法
    public static Phone createPhone(String type){
        if("小米".equals(type)){
            return new XiaoMi();
        }else if("華為".equals(type)){
            return new HuaWei();
        }else{
            throw new RuntimeException("該工廠不可識別型別-->"+type);
        }
    }

    //測試一下工廠類中建立手機的方法
    public static void main(String[] args) {
        Phone p1 = SimpleFactory.createPhone("小米");
        System.out.println(p1.getPhone());
        Phone p2 = SimpleFactory.createPhone("華為");
        System.out.println(p2.getPhone());
    }
}
  • 總結:在簡單工廠中,建立物件的方法中建立物件數量較少,需要建立什麼物件只需要傳入邏輯引數即可,比如上述程式碼中的String type一樣。

二、工廠方法模式

  • 概述

工廠方法模式指定義一個建立物件的介面,但讓是實現了這個介面的類來決定例項化那個類,工廠方法讓類的例項化轉換到子類中進行;簡單理解:定義一個工廠介面,將該介面的實現類都設計成一個工廠,在工廠的實現類中建立物件,這樣就減少了簡單工廠裡面複雜的邏輯判斷,使用者需要哪個物件,只需要獲取對應的工廠,再由工廠獲取物件即可。

  • 圖示

圖片描述

  • 事例程式碼

簡單工廠案例中用到的Phone介面、HuaWei實現類和XiaoMi實現類在這個案例中繼續使用,下面只寫從工廠介面開始

1)建立工廠介面,該介面中只定義,不做實現

public interface PhoneFactory {
	//定義建立電話的方法
    public Phone createPhone();
}

2)定義建立華為電話物件的工廠

public class HuaWeiFactory implements PhoneFactory{
    //重寫建立電話的方法
    @Override
    public Phone createPhone() {
        return new HuaWei();
    }
}

3)定義建立小米手機物件的工廠

public class XiaoMiFactory implements PhoneFactory{
    //重寫建立電話的方法
    @Override
    public Phone createPhone() {
        return new XiaoMi();
    }
}

4)測試上述方法

public class Test {
    public static void main(String[] args) {
        //建立華為手機
        HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
        Phone huaweiPhone = huaWeiFactory.createPhone();
        System.out.println(huaweiPhone.getPhone());

        //建立小米手機
        XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
        Phone xiaomiPhone = xiaoMiFactory.createPhone();
        System.out.println(xiaomiPhone.getPhone());
    }
}
  • 上面工廠介面和工廠介面實現類關係圖

圖片描述

三、抽象工廠

  • 概念

抽象工廠是指提供一個建立一系列相關或相互依賴物件的介面,無需指定他們具體的類;和方法工廠做比較,方法工廠要求先有對應類的物件,如果新增類,那麼就需要新增工廠類,會導致類爆炸;在抽象工廠中,呼叫工廠的時候,可能工廠都還沒有,需要的時候再去拿到具體的工廠或者補充,可以提升系統的擴充套件性

  • 圖示

圖片描述

  • 事例程式碼

這裡仍然引用簡單工廠模式裡面的Phone程式碼,並且按照同樣的模式,新增兩個Computer介面及實現類和Ipad介面及實現類,比較簡單.

1)Phone介面及實現類

//手機介面
public interface Phone {

    //定義獲取手機的方法
    public String getPhone();
}

//華為手機實現類
public class HuaWeiPhone implements Phone{
    @Override
    public String getPhone() {
        return "建立華為手機";
    }
}

//小米手機實現類
public class XiaoMiPhone implements Phone{
    @Override
    public String getPhone() {
        return "建立小米手機";
    }
}

2)Computer介面及實現類

//定義電腦介面
public interface Computer {
    //定義獲取電腦的方法
    public String getComputer();
}

//華為電腦
public class HuaWeiComputer implements Computer{
    @Override
    public String getComputer() {
        return "建立華為電腦";
    }
}

//建立小米電腦
public class XiaoMiComputer implements Computer{
    @Override
    public String getComputer() {
        return "建立小米電腦";
    }
}

3)Ipad介面及實現類

//平板的介面
public interface Ipad {

    public String getIpad();
}

//華為平板電腦
public class HuaWeiIpad implements Ipad{
    @Override
    public String getIpad() {
        return "建立華為平板電腦";
    }
}

//小米平板電腦
public class XiaoMiIpad implements Ipad{
    @Override
    public String getIpad() {
        return "建立小米平板電腦";
    }
}

4)編寫頂層工廠介面

public interface AbstractFactory {
    //定義建立手機的方法
    public Phone createPhone();

    //定義建立電腦的方法
    public Computer createComputer();

    //定義建立平板電腦的方法
    public Ipad createIpad();
}

5)定義華為工廠,實現頂層工廠介面

public class HuaWeiFactory implements AbstractFactory{
    @Override
    public Phone createPhone() {
        return new HuaWeiPhone();
    }

    @Override
    public Computer createComputer() {
        return new HuaWeiComputer();
    }

    @Override
    public Ipad createIpad() {
        return new HuaWeiIpad();
    }
}

6)定義小米工廠,實現頂層工廠介面

public class XiaoMi implements AbstractFactory{
    @Override
    public Phone createPhone() {
        return new XiaoMiPhone();
    }

    @Override
    public Computer createComputer() {
        return new XiaoMiComputer();
    }

    @Override
    public Ipad createIpad() {
        return new XiaoMiIpad();
    }
}

7)測試類

public class Test {
    public static void main(String[] args) {
        //建立華為物件
        HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
        Phone huaweiPhone = huaWeiFactory.createPhone();
        Computer huaweiComputer = huaWeiFactory.createComputer();
        Ipad huaweiIpad = huaWeiFactory.createIpad();
        //列印
        System.out.println(huaweiPhone.getPhone()+":"+
                huaweiComputer.getComputer()+":"+
                huaweiIpad.getIpad());

        //建立小米物件
        XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
        Phone xiaomiPhone = xiaoMiFactory.createPhone();
        Computer xiaomiComputer = xiaoMiFactory.createComputer();
        Ipad xiaomiIpad = xiaoMiFactory.createIpad();
        //列印
        System.out.println(xiaomiPhone.getPhone()+":"+
                xiaomiComputer.getComputer()+":"+
                xiaomiIpad.getIpad());

    }
}
  • 工廠介面及對應實現類的關係圖

圖片描述

以上就是工廠設計模式的內容!!!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/756/viewspace-2797199/,如需轉載,請註明出處,否則將追究法律責任。

相關文章