淺談抽象工廠模式(Abstract Factory Pattern)

抽象工廠模式

之前我們瞭解了簡單工廠模式工廠方法模式,那麼在工廠模式族中還有一個抽象工廠模式(Abstract Factory Pattern)

抽象工廠模式的介紹

抽象工廠模式是一種比較常用的模式,定義如下:

爲創建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的具體類

抽象工廠模式常用來解決一系列具有相關約束的產品族生成的問題,和工廠方法模式的相比,抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的對象是一種非常好的解決方法。

模式組成

抽象工廠模式的通用類圖如下:
在這裏插入圖片描述
下面的類圖是抽象工廠模式的通用源碼類圖
在這裏插入圖片描述

角色 關係 作用
AbstractProductA(抽象產品類) 具體產品族A的父類 描述產品族A的公共接口
AbstractProductB(抽象產品類) 具體產品族B的父類 描述產品族B的公共接口
ProductA1(具體產品) 抽象產品A的子類 描述具體生產的產品
ProductA2(具體產品) 抽象產品A的子類 描述具體生產的產品
ProductB1(具體產品) 抽象產品B的子類 描述具體生產的產品
ProductB2(具體產品) 抽象產品B的子類 描述具體生產的產品
AbstractCreator(抽象工廠類) 具體工廠的父類 描述具體工廠的公共接口
Creator(具體工廠類) 具體工廠 描述具體工廠

表述代碼

首先我們需要聲明抽象產品類族(A和B)

public abstract class AbstractProductA {

	//每個產品共有的方法
	public void shareMethod() {
		
	}
	//每個產品相同的方法,不同實現
	public abstract void doSomething();
}

public abstract class AbstractProductB {
	//每個產品共有的方法
	public void shareMethod() {
		
	}
	//每個產品相同的方法,不同實現
	public abstract void doSomething();
}

在每一個抽象產品類族中,都有不同的產品等級分類,對於產品等級,我們實現相關的具體產品類

public class ProductA1 extends AbstractProductA {

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("產品A1的實習方法");
		
	}
}

public class ProductA2 extends AbstractProductA {

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("產品A2的實現方法");
		
	}

}

public class ProductB1 extends AbstractProductB {

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("產品B1的實現方法");
		
	}
}

public class ProductB2 extends AbstractProductB {

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("產品B2的生產方法");
		
	}
}

聲明抽象工廠類:

/**
 * 抽象工廠類
 * @author lishanlei
 *
 */
public abstract class AbstractCreator {

	//創建A產品家族
	public abstract AbstractProductA createProductA();
	
	//創建B產品家族
	public abstract AbstractProductB createProductB();
}

對於每個產品等級,實現一個具體的工廠類:
產品等級1的實現類

/**
 * 產品等級1的實現類
 * @author lishanlei
 *
 */
public class Creator1 extends AbstractCreator {

	//只生產產品等級爲1的A產品
	@Override
	public AbstractProductA createProductA() {
		// TODO Auto-generated method stub
		return new ProductA1();
	}
	//只生產產品等級爲1的B產品
	@Override
	public AbstractProductB createProductB() {
		// TODO Auto-generated method stub
		return new ProductB1();
	}

}

產品等級2的實現類:

/**
 * 產品等級爲2的實現類
 * @author lishanlei
 *
 */
public class Creator2 extends AbstractCreator {

	//只生產產品等級爲2的A產品
	@Override
	public AbstractProductA createProductA() {
		// TODO Auto-generated method stub
		return new ProductA2();
	}

	//只生產產品等級爲2的B產品
	@Override
	public AbstractProductB createProductB() {
		// TODO Auto-generated method stub
		return new ProductB2();
	}

}

最後是我們的業務類:

public class Client {

	public static void main(String[] args) {
		
		//定義兩個工廠
		AbstractCreator creator1 = new Creator1();
		AbstractCreator creator2 = new Creator2();
		
		//產生A1對象
		AbstractProductA a1 = creator1.createProductA();
		
		//產生A2對象
		AbstractProductA a2 = creator2.createProductA();
		
		//產生B1對象
		AbstractProductB b1 = creator1.createProductB();
		
		//產生B2對象
		AbstractProductB b2 = creator2.createProductB();
		
	}
}

注意事項

  • 有N個產品族,在抽象工廠類中就應該有N個創建方法
  • 有M個產品等級就應該有M個實現工廠類,在每個實現工廠類中,實現不同產品族的生產任務

抽象工廠模式的優點

  • 封裝性,每個產品的實現類不是高層模塊要關心的
  • 產品族內的約束爲非公開狀態,具體的產品族內的約束是在工廠內實現的

抽象工廠模式的缺點

  • 產品族的擴展非常困難(注意:不是產品等級擴展困難)

使用場景

  • 一個對象族都有相同的約束,則可以使用抽象工廠模式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章