場景:
考慮組裝電腦,客戶需要自己選擇一系列的電腦配件,組裝電腦的公司需要根據客戶所選擇的的配件去組裝.
但這樣會有一個問題,如果客戶瞭解CPU和主板的兼容配置還好,萬一選了倆個不一樣的則會出現錯誤,該爭麼樣防止客
戶選錯呢?這就需要組裝電腦的公司提供給客戶一些參數,像多套兼容的CPU和主板配置,客戶從中選取其中一套方案就
不會出錯,因爲每一套規格都是組裝公司定製好的,不會出現不兼容。
抽象工廠是爲了解決只知道一系列對象的接口,不知道具體實現或者是不知道具體使用哪一個實現,另外這系
列對象是相互依賴的.也就是既要創建接口的對象,還要約束它們之間的關係。
定義:
提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們具體的類。
角色:
Abstract Factory:
抽象工廠,定義創建一系列產品對象的操作接口.
package com.kris.study;
public interface AbstractFactory {
public AbstractProductA createProductA();
public AbstractProductB createProductB();
}
Concrete Factory:
具體的工廠,實現抽象工廠定義的方法,具體實現一系列有關產品的創建.
package com.kris.study;
public class ConcreteFactory implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA();
}
@Override
public AbstractProductB createProductB() {
return new ProductB();
}
}
package com.kris.study;
public class ConcreteFactory2 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
Abstract Product:
定義一類產品的接口
package com.kris.study;
public interface AbstractProductA {
//抽象產品A的相關操作 例如返回針腳數目
public int getHeadNum();
public void displayHeadNum();
}
package com.kris.study;
public interface AbstractProductB {
//抽象產品B的相關操作 例如返回針腳數目
public int getFootNum();
public void displayFootNum();
}
Concrete Product:
具體的產品實現對象,通常是在具體工廠Concrete Factory裏面創建的具體產品對象。
package com.kris.study;
public class ProductA implements AbstractProductA {
@Override
public int getHeadNum() {
return 115;
}
@Override
public void displayHeadNum() {
System.out.println(getHeadNum());
}
}
package com.kris.study;
public class ProductB implements AbstractProductB {
@Override
public int getFootNum() {
return 115;
}
@Override
public void displayFootNum() {
System.out.println(getFootNum());
}
}
package com.kris.study;
public class ProductA2 implements AbstractProductA {
@Override
public int getHeadNum() {
return 224;
}
@Override
public void displayHeadNum() {
System.out.println(getHeadNum());
}
}
package com.kris.study;
public class ProductB2 implements AbstractProductB {
@Override
public int getFootNum() {
return 224;
}
@Override
public void displayFootNum() {
System.out.println(getFootNum());
}
}
Client:
客戶端
package com.kris.study;
public class Client {
public static void main(String[] args) {
AbstractFactory factory = new ConcreteFactory();
factory.createProductA().displayHeadNum();
factory.createProductB().displayFootNum();
System.out.println("----------");
AbstractFactory factory2 = new ConcreteFactory2();
factory2.createProductA().displayHeadNum();
factory2.createProductB().displayFootNum();
}
}
原理分析:
抽象工廠的功能是爲一系列相關的對象或相互依賴對象創建一個接口。接口內的方法一定是一系列相關的或相互依賴
的方法而不是任意堆砌的,通常AbstractFactory定義的創建產品的方法可以看成是工廠方法.由於抽象工廠定義的是
一系列產品簇,也就是切換不同產品簇的時候,只要提供不同的工廠就可以了,也就是以整個產品簇作爲整體切換。
優點:
分離接口和實現,切換產品簇(相互依賴的一系列對象)變的容易、
缺點:
不太容易擴展新的產品,容易照成類層次複雜。每一層負責一種選擇,也就是一層屏蔽一種變化。
本質:選擇產品簇的實現
區別:
工廠方法或簡單工廠關注的是單個產品對象的創建,只不過簡單工廠是在父類直接選擇實現,工廠方法是把實現
延遲到子類。
抽象工廠關注的是一系列的產品,這些產品相互之間有依賴關係,需要進行約束。