抽象工廠模式(Abstraci Factory): 提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口策菜,而無需指定它們具體的類酒贬。
源碼
CPU接口與具體實現(xiàn)
public interface Cpu {
public void calculate();
}
public class IntelCpu implements Cpu {
/**
* CPU的針腳數(shù)
*/
private int pins = 0;
public IntelCpu(int pins){
this.pins = pins;
}
@Override
public void calculate() {
// TODO Auto-generated method stub
System.out.println("Intel CPU的針腳數(shù):" + pins);
}
}
public class AmdCpu implements Cpu {
/**
* CPU的針腳數(shù)
*/
private int pins = 0;
public AmdCpu(int pins){
this.pins = pins;
}
@Override
public void calculate() {
// TODO Auto-generated method stub
System.out.println("AMD CPU的針腳數(shù):" + pins);
}
}
主板接口與具體實現(xiàn)
public interface Mainboard {
public void installCPU();
}
public class IntelMainboard implements Mainboard {
/**
* CPU插槽的孔數(shù)
*/
private int cpuHoles = 0;
/**
* 構(gòu)造方法,傳入CPU插槽的孔數(shù)
* @param cpuHoles
*/
public IntelMainboard(int cpuHoles){
this.cpuHoles = cpuHoles;
}
@Override
public void installCPU() {
// TODO Auto-generated method stub
System.out.println("Intel主板的CPU插槽孔數(shù)是:" + cpuHoles);
}
}
public class AmdMainboard implements Mainboard {
/**
* CPU插槽的孔數(shù)
*/
private int cpuHoles = 0;
/**
* 構(gòu)造方法蠢莺,傳入CPU插槽的孔數(shù)
* @param cpuHoles
*/
public AmdMainboard(int cpuHoles){
this.cpuHoles = cpuHoles;
}
@Override
public void installCPU() {
// TODO Auto-generated method stub
System.out.println("AMD主板的CPU插槽孔數(shù)是:" + cpuHoles);
}
}
抽象工廠類和實現(xiàn)類
public interface AbstractFactory {
/**
* 創(chuàng)建CPU對象
* @return CPU對象
*/
public Cpu createCpu();
/**
* 創(chuàng)建主板對象
* @return 主板對象
*/
public Mainboard createMainboard();
}
public class AmdFactory implements AbstractFactory {
//創(chuàng)建 Amd CPU
@Override
public Cpu createCpu() {
// TODO Auto-generated method stub
return new IntelCpu(938);
}
//創(chuàng)建 Amd 主板
@Override
public Mainboard createMainboard() {
// TODO Auto-generated method stub
return new IntelMainboard(938);
}
}
public class IntelFactory implements AbstractFactory {
//創(chuàng)建 Intel CPU
@Override
public Cpu createCpu() {
// TODO Auto-generated method stub
return new IntelCpu(755);
}
//創(chuàng)建 Intel 主板
@Override
public Mainboard createMainboard() {
// TODO Auto-generated method stub
return new IntelMainboard(755);
}
}
裝機(jī)工程師類跟前面的實現(xiàn)相比躏将,主要的變化是:從客戶端不再傳入選擇CPU和主板的參數(shù)祸憋,而是直接傳入客戶已經(jīng)選擇好的產(chǎn)品對象会宪。這樣就避免了單獨(dú)去選擇CPU和主板所帶來的兼容性問題蚯窥,客戶要選就是一套,就是一個系列
巍沙。
public class ComputerEngineer {
/**
* 定義組裝機(jī)需要的CPU
*/
private Cpu cpu = null;
/**
* 定義組裝機(jī)需要的主板
*/
private Mainboard mainboard = null;
public void makeComputer(AbstractFactory af){
/**
* 組裝機(jī)器的基本步驟
*/
//1:首先準(zhǔn)備好裝機(jī)所需要的配件
prepareHardwares(af);
//2:組裝機(jī)器
//3:測試機(jī)器
//4:交付客戶
}
private void prepareHardwares(AbstractFactory af){
//這里要去準(zhǔn)備CPU和主板的具體實現(xiàn)荷鼠,為了示例簡單允乐,這里只準(zhǔn)備這兩個
//可是,裝機(jī)工程師并不知道如何去創(chuàng)建牍疏,怎么辦呢?
//直接找相應(yīng)的工廠獲取
this.cpu = af.createCpu();
this.mainboard = af.createMainboard();
//測試配件是否好用
this.cpu.calculate();
this.mainboard.installCPU();
}
}
客戶端代碼:
public class Client {
public static void main(String[]args){
//創(chuàng)建裝機(jī)工程師對象
ComputerEngineer cf = new ComputerEngineer();
//客戶選擇并創(chuàng)建需要使用的產(chǎn)品對象
AbstractFactory af = new IntelFactory();//創(chuàng)建具體的實現(xiàn)對象
//告訴裝機(jī)工程師自己選擇的產(chǎn)品挺尿,讓裝機(jī)工程師組裝電腦
cf.makeComputer(af);
}
}