設計模式之工廠模式

工廠模式是Java常用的設計模式之一,屬於創建型模式,在平常開發中是很常見的。主要是用在複雜對象的實例化中,通過工廠模式對外屏蔽複雜的具體實現,達到解耦效果。
工廠模式細分爲簡單工廠模式工廠模式抽象工廠模式
閱讀本文,建議從頭到尾,因爲知識點由淺到深,看似簡單,精粹卻深藏其中,願讀者慢慢食用並消化之。
簡單工廠模式
在深圳的某個地方,有個工廠,生產機頂盒(STB),機頂盒的又分小米機頂盒和TCL機頂盒。由於機頂盒的生產過程是非常複雜的工藝,所以工廠對小米和TCL公司說,需要需要生產對應的機頂盒找我就好。

  1. 所以首先要有機頂盒這個概念,所以我們抽象出機頂盒接口,使其作爲小米機頂盒、TCL機頂盒的父類。該機頂盒功能我們暫時定義是否支持帶USB口,是否支持杜比,播放視頻。現實機頂盒是比較複雜的,這裏舉例說明簡單點。
public interface STB {
    /**
     * 是否帶USB接口
     * @return true,帶USB接口,false,不帶USB接口
     */
    boolean hasUSBInterface();

    /**
     * 是否支持杜比播放
     * @return true,表示支持,false,表示不支持
     */
    boolean supportDolby();

    /**
     * 播放視頻
     */
    void playVideo();

}
  1. 接下來,小米機頂盒和TCL機頂盒的具體實現,根據自身的定製,支持的功能。
    小米機頂盒具體實現類
public class XiaoMiSTB implements STB {
    @Override
    public boolean hasUSBInterface() {
        return true;
    }

    @Override
    public boolean supportDolby() {
        return false;
    }


    @Override
    public void playVideo() {
        System.out.println("我是小米機頂盒,正在播放視頻");
    }

}

TCL機頂盒具體實現類


public class TCLSTB implements STB {
    @Override
    public void playVideo() {
        System.out.println("我是TCL機頂盒,正在播放視頻");
    }

    @Override
    public boolean hasUSBInterface() {
        return false;
    }

    @Override
    public boolean supportDolby() {
        return false;
    }
}
  1. 有了盒子,那麼那就需要工廠來生產了,所以我們造一座工廠出來,負責生產小米和TCL機頂盒。
public class STBFactory {

    public final static String XIAO_MI = "xiaomi";

    public final static String TCL = "tcl";


    public STB getSTB(String stbType) {
        switch (stbType) {
            case XIAO_MI:
                return new XiaoMiSTB();
            case TCL:
                return new TCLSTB();
            default:
                return null;
        }
    }
}

  1. 小米和TCL公司來訂單了,要工廠生產自己家公司的機頂盒,用來播放視頻。
public class SimpleFactory {

    public static void main(String[] args) {
        //穿建工廠實例
        STBFactory stbFactory = new STBFactory();
        //通知工廠,生產小米機頂盒,獲取小米機頂盒實例
        STB xiaomiSTB = stbFactory.getSTB(STBFactory.XIAO_MI);
        //小米機頂盒播放視頻
        xiaomiSTB.playVideo();
        
        //通知工廠,生產TCL機頂盒,獲取TCL機頂盒實例
        STB tclSTB = stbFactory.getSTB(STBFactory.TCL);
        //TCL機頂盒播放視頻
        tclSTB.playVideo();
    }

}

5 用戶已經在家裏看視頻了,生產成功了,機頂盒可正常使用。


工廠模式
隨着工廠規模的擴大,機頂盒工廠分設兩個子工廠,分別用於生產對應小米機頂盒和TCL機頂盒。生產機頂盒的牌子由子工廠決定,不再需要機頂盒工廠通過下發命令(參數)來控制。這裏主要也是涉及到Java多態特性。
1 爲此,我們需要重新調整機頂盒的業務,即代碼內容,我們將機頂盒工廠抽象爲一個接口,不在具體管理生產,由子工廠管理生產。

public interface STBFactroy {
    /**
     * 生產機頂盒,獲取機頂盒實例
     * @return
     */
    STB getSTB();
}
  1. 造兩座子工廠,分別爲小米工廠和TCL工廠。
    小米工廠
public class XiaoMiFactory implements STBFactroy  {
    @Override
    public STB getSTB() {
        return new XiaoMiSTB();
    }
}

TCL工廠

public class TCLFactory implements STBFactroy {
    @Override
    public STB getSTB() {
        return new TCLSTB();
    }
}
  1. 工廠業務員真棒,子工廠剛建立,立馬就收到TCL公司的新訂單,並生產了盒子,播放視頻正常。
public class Factory {
    public static void main(String[] args) {
        
       STBFactroy stbFactroy=new TCLFactory();

       STB stb=stbFactroy.getSTB();

       stb.playVideo();
    }
}

抽象工廠模式
在工廠業務日益繁榮的情況下,工廠決定增設手機業務,主要生產小米手機和TCL手機。此時,工廠從一個機頂盒產品變成兩個兩個產品,機頂盒和手機。相對應的工廠模式也變成了抽象工廠模式。在此,可以看到,只有一個產品,是工廠模式,兩個產品,就是抽象工廠模式。

  1. 定義手機概念,抽象一個Phone接口,具有撥打電話和版本信息。
public interface Phone {

    /**
     * 撥打電話
     */
    void call();

    /**
     * 系統信息
     */
    void build();
}
  1. 手機的具體牌子,實現類。
    小米手機
public class XiaoMiPhone implements Phone {
    @Override
    public void call() {
        System.out.println("小米手機正在撥打電話");
    }

    @Override
    public void build() {
        System.out.println("我是小米手機");
    }
}

TCL手機

public class TCLPhone implements Phone {
    @Override
    public void call() {
        System.out.println("TCL手機正在撥打電話");
    }

    @Override
    public void build() {
        System.out.println("我是TCL手機");
    }
}
  1. 爲總工廠添加生產手機業務,子工廠具體負責實現。
    父類工廠接口,抽象子工廠的業務
public interface HeadFactory {
    /**
     * 生產機頂盒,獲取機頂盒實例
     * @return
     */
    STB getSTB();

    /**
     * 生產手機,獲取手機實例
     * @return
     */
    Phone getPhone();
}

小米工廠實現類

public class XiaoMiFactory implements HeadFactory {
    @Override
    public STB getSTB() {
        return new XiaoMiSTB();
    }

    @Override
    public Phone getPhone() {
        return  new XiaoMiPhone();
    }
}

TCL工廠實現類

public class TCLFactory implements HeadFactory {
    @Override
    public STB getSTB() {
        return new TCLSTB();
    }

    @Override
    public Phone getPhone() {
        return  new TCLPhone();
    }
}
  1. 工廠已經建立完畢,是時候接單進行生產了,在保持舊業務的持續發展下,接來了TCL的手機新訂單。

public class Factory {
    public static void main(String[] args) {

       HeadFactory stbFactory =new XiaoMiFactory();

       STB stb= stbFactory.getSTB();

       stb.playVideo();

       Phone phone=stbFactory.getPhone();

       phone.build();
    }

}
  1. 小米手機看來使用正常


到此,設計模式中的工廠模式就介紹完畢了,下面進行總結一下。

  • 如果類比較簡單,新建一個對象,採用工廠模式是得不償失的,通過上面的例子,創建一個簡單的對象,可能需要創建很多的類。工廠模式適合在明確條件下,有多少對象,有多少分支,建立對象比較複雜的情況下去選擇。
  • 工廠模式的初心是解耦,所以別了使用工廠模式,而更加耦合。
  • 簡單工廠模式,工廠模式,抽象工廠模式都是相互關聯的。工廠模式相對於簡單工廠模式,只是讓實現類去生成對象,而不是根據條件去判斷。抽象工廠模式相對於工廠模式,只是對象的多少問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章