抽象工廠模式是一個比較常用的設計模式,它的英文原話是:
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
意思是:爲創建一組相關和相互依賴的對象提供一個接口,而且無須指定它們的具體類。
抽象工廠模式的UML圖如下
涉及到4個對象:
抽象工廠角色,該角色是抽象工廠模式的核心,與應用系統無關。
具體工廠角色:需要實現抽象工廠接口,含有相應的對象選擇邏輯,並接受應用調用以創建產品對象。
抽象產品角色:該角色定義某類產品的共性,是產品的抽象定義。
具體產品角色:實現抽象產品角色接口,抽象工廠模式鎖創建的任何產品對象都是具體產品角色的一個實例。
抽象工廠模式的一個應用
現有手機和電腦兩款產品,Apple公司生產iphone和MacBook,Samsung公司生產Galaxy和Samsung牌電腦。
現在需要手機和電腦一套裝備,而且不希望出現混搭的情況,也就是說具體的手機產品和電腦產品是相互依賴的,如iphone配Mac,galaxy配Samsung
如果採用之前的工廠方法模式很容易出錯(產生混搭的情況),抽象工廠模式則可以解決掉對象之間的這種約束關係。
用例的UML圖形如下:
代碼如下:
抽象產品接口Phone:
public interface Phone {
public void use();
}
抽象產品接口Computer
public interface Computer {
public void use();
}
具體產品角色IPhone
public class IPhone implements Phone {
@Override
public void use() {
System.out.println("This is a iphone");
}
}
具體產品角色MacBook
public class MacBook implements Computer{
@Override
public void use() {
System.out.println("This is a apple computer.");
}
}
具體產品角色Galaxy5
public class Galaxy5 implements Phone {
@Override
public void use() {
System.out.println("This is a samsung phone");
}
}
具體產品角色SamsungComputer
public class SamsungComputer implements Computer {
@Override
public void use() {
System.out.println("This is a samsung computer.");
}
}
核心抽象工廠角色AbstractFactory
public interface AbstractFactory {
public Phone createPhone();
public Computer createComputer();
}
具體工廠角色AppleFactory
public class AppleFactory implements AbstractFactory {
@Override
public Computer createComputer() {
return new MacBook();
}
@Override
public Phone createPhone() {
return new IPhone();
}
}
具體工廠角色SamsungFactory
public class SamsungFactory implements AbstractFactory {
@Override
public Computer createComputer() {
return new SamsungComputer();
}
@Override
public Phone createPhone() {
return new Galaxy5();
}
}
客戶端調用測試類:
public class Client {
public static void main(String[] args) {
AbstractFactory af = new AppleFactory();
Phone iphone = af.createPhone();
Computer mac = af.createComputer();
iphone.use();
mac.use();
System.out.println("-----------------------");
AbstractFactory sf = new SamsungFactory();
Phone s5 = sf.createPhone();
Computer samsung = sf.createComputer();
s5.use();
samsung.use();
}
}
抽象工廠模式的優點
抽象工廠模式是工廠方法模式的進一步抽象,針對的是一族產品。如果產品中只有一種產品,則抽象工廠模式就退化成工廠方法模式。
除了工廠方法模式具有的優點外,抽象工廠模式還具有以下優點:
- 產品族內的約束是不可見的,在不同的工廠中,各種產品之間可能存在不同的依賴關係,這些依賴關係由工廠封裝在工廠的內部,對工廠的使用者是不可見的;
- 產品線的擴展非常容易,如果針對同一產品族建立新的生產線(如再加入一個聯想手機和電腦的生產線),只需要實現產品族中所有的接口並建立新的工廠類即可。
缺點:產品族本身的擴展比較困難,如果需要在產品族中增加一個新的產品類型(如果需要生產耳機產品),那麼就需要修改多個接口,並且會影響到現有的工廠類。