抽象工廠模式

抽象工廠模式是一個比較常用的設計模式,它的英文原話是:

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();
		
	}
}

抽象工廠模式的優點

抽象工廠模式是工廠方法模式的進一步抽象,針對的是一族產品。如果產品中只有一種產品,則抽象工廠模式就退化成工廠方法模式。

除了工廠方法模式具有的優點外,抽象工廠模式還具有以下優點:

  • 產品族內的約束是不可見的,在不同的工廠中,各種產品之間可能存在不同的依賴關係,這些依賴關係由工廠封裝在工廠的內部,對工廠的使用者是不可見的;
  • 產品線的擴展非常容易,如果針對同一產品族建立新的生產線(如再加入一個聯想手機和電腦的生產線),只需要實現產品族中所有的接口並建立新的工廠類即可。

缺點:產品族本身的擴展比較困難,如果需要在產品族中增加一個新的產品類型(如果需要生產耳機產品),那麼就需要修改多個接口,並且會影響到現有的工廠類。



發佈了65 篇原創文章 · 獲贊 34 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章