設計模式(五)Builder構建者模式

thekingisalwayslucky發表於2019-04-20

Builder模式,又稱生成器或構建者模式,屬於物件建立型模式,側重於一步一步的構建複雜物件,只有在構建完成後才會返回生成的物件。Builder模式將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

使用場景

1、當建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時,比如買一臺電腦,我不需要知道電腦CPU,主機板,機箱是如何生產的,也不需要知道它們是如何組裝的。

2、當構造過程必須允許被構造的物件有不同的表示時,比如一臺電腦即可以使用AMD的CPU,也可以使用Inter的CPU,這些都是可以根據需求變化的。

/**
 * 構建者模式:將一個複雜物件的構建與它的表示分離, 使得同樣的構建過程可以建立不同的表示。
 * 
 * @author qbg
 * 
 */
public class BuilderPattern {
    /**
     * 機箱抽象類
     */
    abstract class Crate {
        public String toString() {
            return "abstract crate...";
        }
    }

    /**
     * 酷冷至尊機箱
     */
    class CoolerMasterCrate extends Crate {
        public String toString() {
            return "CoolerMaster crate...";
        }
    }

    /**
     * CPU抽象類
     */
    abstract class CPU {
        public String toString() {
            return "abstract cpu...";
        }
    }

    /**
     * AMD CPU
     */
    class AMDCPU extends CPU {
        public String toString() {
            return "AMD cpu...";
        }
    }

    /**
     * 主機板抽象類
     */
    abstract class Motherboard {
        public String toString() {
            return "abstract motherboard...";
        }
    }

    /**
     * 華碩主機板
     */
    class ASUSMotherboard extends Motherboard {
        public String toString() {
            return "ASUS motherboard...";
        }
    }

    /**
     * 電腦定義類
     */
    class Computer {
        CPU cpu; // cpu
        Motherboard motherboard; // 主機板
        Crate crate;// 機箱

        public String toString() {
            return "CPU:" + cpu + "\nMotherboard:" + motherboard + "\nCrate:"
                    + crate;
        }
    }

    /**
     * 電腦構建者介面,可以將CPU等部件通過工廠模式來生產,以進一步分離產品部件生成和構建的過程...
     */
    interface ComputerBuilder {
        public ComputerBuilder buildCPU();

        public ComputerBuilder buildMotherboard();

        public ComputerBuilder buildCrate();

        public Computer getProduct();
    }

    /**
     * 最熱臺式電腦構建實現類
     */
    class HotDeskComputerBuilder implements ComputerBuilder {
        private Computer computer;

        public HotDeskComputerBuilder() {
            this.computer = new Computer();
        }

        public ComputerBuilder buildCPU() {
            computer.cpu = new AMDCPU();
            return this;
        }

        public ComputerBuilder buildMotherboard() {
            computer.motherboard = new ASUSMotherboard();
            return this;
        }

        public ComputerBuilder buildCrate() {
            computer.crate = new CoolerMasterCrate();
            return this;
        }

        public Computer getProduct() {
            buildMotherboard().buildCPU().buildCrate();
            return computer;
        }
    }

    /**
     * 導向器,客戶端通過導向器獲取產品, 而不關心導向器是怎樣獲取到Builder生成器 構建的產品物件的。而具體的構建過程則交給具體的Builder。
     */
    class Director {
        private ComputerBuilder builder;

        public Director(ComputerBuilder builder) {
            this.builder = builder;
        }

        /**
         * 返回構造好的產品
         */
        public Computer construct() {
            return builder.getProduct();
        }
    }

    public static void main(String[] args) {
        BuilderPattern bp = new BuilderPattern();
        ComputerBuilder builder = bp.new HotDeskComputerBuilder();
        Director director = bp.new Director(builder);
        Computer computer = director.construct();
        System.out.println(computer);
    }
}
複製程式碼

模式優缺點

優點:

1、可以改變一個產品的內部表示,比如示例中只要實現一個新的ComputerBuilder就能改變電腦的內部元件,因為電腦的表示和內部結構是獨立於客戶端程式碼的。

2、將構造程式碼和表示程式碼分離,構造程式碼相當於builder,表示程式碼相當於director。不同的導向器可以使用相同的生成器也構造不同的產品。

note:幹活不如寫PPT

相關文章