1. 程式人生 > >抽象工廠模式與工廠方法模式的區別

抽象工廠模式與工廠方法模式的區別

dma ati ring factor elf ride 測試 string this

  抽象工廠模式與工廠方法模式的最大區別在於,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則需要面對多個產品等級結構

  在什麽情況下應當使用抽象工廠模式?

  這個系統的產品有多於一個的產品族,而系統只選擇消費其中某一族的產品。例如,組裝電腦是用Inter的產品族還是用AMD的產品族,當選擇其中一個品牌後,再確定用這個品牌下的組件,CPU、主板、顯卡等來組裝一臺電腦。這就取決於實施人員在組裝的時候設置參數來決定使用哪一個品牌。

  同屬於同一個產品族的產品是一起使用的,這一約束必須在系統的設計中體現出來。比如:Intel的產品是屬於Intel產品族,而AMD的產品屬於AMD產品族。將CPU和主板是這兩個版本(產品族)擁有的產品,而抽象工廠有兩個具體工廠實現類IntelFactory、AmdFactory負責分別創建Intel Cpu、Inter主版和AMDCPU和AMD主板。當用戶需要組裝電腦時,先需要選擇是CPU和主板。當不使用抽象工廠可能會出現如下情況 :用戶選擇了Intel的CPU和AMD的主板。這兩者插槽是不匹配的。這樣就會出現問題

。如果使用抽象工廠,那抽象工廠的具體實現類會幫你創建一個產品族中的一系列產品對象,如Intel工廠會創建IntelCpu和Intel主板,AMD工廠會創建AMDCPU和AMD主板。
其實抽象工廠就是起到了一定的約束作用,它所創建的都是同一個產品族中的一系列產品對象。防止出現上面例子中創建不同產品族中產品所帶來的問題。

創建CPU:

public interface Cpu {
     //計算方法
     void calculate();
}
public class IntelCpu implements Cpu {
    //cpu的針腳數
    private int pins=0;
    public IntelCpu(int pins) {
        this.pins = pins;
    }
    @Override
    public void calculate() {
        System.out.println("Interl CPU的針腳數:"+pins);
    }
}
public class AmdCpu implements Cpu {
    private int pins=0;
    public AmdCpu(int pins) {
        this.pins = pins;
    }
    @Override
    public void calculate() {
        System.out.println("AMD CPU的針腳數:"+pins);
    }
}

創建主板

public interface Mainboard {
    //安裝CPU方法
    void instalCpu();
}
public class IntelMainboard implements Mainboard {
    //cpu插槽的孔數
    private int cpuHoles=0;
    public IntelMainboard(int cpuHoles) {
        this.cpuHoles = cpuHoles;
    }
    @Override
    public void instalCpu() {
        System.out.println("Intel主板的CPU插槽孔數是:"+cpuHoles);
    }
}
public class AmdMainboard implements Mainboard {
        //cpu插槽的孔數
        private int cpuHoles=0;
        public AmdMainboard(int cpuHoles) {
            this.cpuHoles = cpuHoles;
        }
        @Override
        public void instalCpu() {
            System.out.println("AMD主板的CPU插槽孔數是:"+cpuHoles);
        }
}

工廠: 

public interface AbstractFactory {
    Cpu createCpu();
    Mainboard createMainboard();
}
public class AmdFactory implements AbstractFactory {
    @Override
    public Cpu createCpu() {
        return new AmdCpu(938);
    }

    @Override
    public Mainboard createMainboard() {
        return new AmdMainboard(938);
    }
}
public class IntelFactory implements AbstractFactory {
    @Override
    public Cpu createCpu() {
        return new IntelCpu(755);
    }

    @Override
    public Mainboard createMainboard() {
        return new IntelMainboard(755);
    }
}

工程師

public class Engineer {
    //定義組裝機需要的CPU
    private Cpu cpu=null;
    //定義組裝需要的主板
    private Mainboard mainboard=null;
    //組裝電腦
    public void makeComputer(AbstractFactory af){
        //組裝機器的基本步驟
        prepareHardwares(af);
    }

    private void prepareHardwares(AbstractFactory af) {
        //直接找工廠獲取
        this.cpu=af.createCpu();
        this.mainboard= af.createMainboard();
        //測試配件是否可用
        this.cpu.calculate();
        this.mainboard.instalCPU();
    }
}

客戶端

public class Client {
    public static void main(String[] args) {
        //創建裝機工程師對象
        Engineer engineer = new Engineer();
        //客戶選擇並創建需要使用的產品對象
        AbstractFactory af = new IntelFactory();
        //告訴裝機工程師自己選擇的產品
        engineer.makeComputer(af);
    }
}

  

抽象工廠模式與工廠方法模式的區別