Builder設計模式

Builder模式,又稱生成器或構建者模式,屬於對象建立型模式,側重於一步一步的構建複雜對象,只有在構建完成後纔會返回生成的對象。Builder模式將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。java

使用場景

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

二、當構造過程必須容許被構造的對象有不一樣的表示時,好比一臺電腦便可以使用AMD的CPU,也能夠使用Inter的CPU,這些都是能夠根據需求變化的。ui

/**
 * 構建者模式:將一個複雜對象的構建與它的表示分離, 使得一樣的構建過程能夠建立不一樣的表示。
 * 
 * @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);
    }
}

模式優缺點this

優勢:spa

一、能夠改變一個產品的內部表示,好比示例中只要實現一個新的ComputerBuilder就能改變電腦的內部組件,由於電腦的表示和內部結構是獨立於客戶端代碼的。code

二、將構造代碼和表示代碼分離,構造代碼至關於builder,表示代碼至關於director。不一樣的導向器能夠使用相同的生成器也構造不一樣的產品。對象

相關文章
相關標籤/搜索