抽象工廠模式
類圖
定義
- 爲創建一組相關或相互依賴的對象提供一個接口,而且無需指定它們的具體類
優缺點
- 優點:封裝性,每個產品的實現類不是高層模塊要關心的,它要關心的是接口或抽象類
- 缺點:產品族擴展非常困難,嚴重違反開閉原則
使用場景
- 一個對象族都有相同的約束
注意事項
- 抽象工廠模式,產品族擴展困難,但產品等級擴展卻非常容易
下面我們新建2種產品AB,每種產品分爲等級1和等級2
抽象產品類
public abstract class AbstractProduct {
/**
* 每個產品共有的方法
*/
public void shareMethod() {
System.out.println("每個產品共有的方法");
}
}
抽象產品類A
public abstract class AbstractProductA extends AbstractProduct {
/**
* 每個產品相同方法,實現不同
*/
public abstract void doSomething();
}
抽象產品類B
public abstract class AbstractProductB extends AbstractProduct {
/**
* 每個產品相同方法,實現不同
*/
public abstract void doSomething();
}
抽象工廠類
public abstract class AbstractCreator {
/**
* 創建A產品家族
*
* @return A產品家族
*/
public abstract AbstractProductA createProductA();
/**
* 創建B產品家族
*
* @return B產品家族
*/
public abstract AbstractProductB createProductB();
}
產品A等級1的實現類
public class ProductA1 extends AbstractProductA {
public void doSomething() {
System.out.println("產品A1的實現方法");
}
}
產品A等級2的實現類
public class ProductA2 extends AbstractProductA {
public void doSomething() {
System.out.println("產品A2的實現方法");
}
}
產品B等級1的實現類
public class ProductB1 extends AbstractProductB {
public void doSomething() {
System.out.println("產品B1的實現方法");
}
}
產品B等級2的實現類
public class ProductB2 extends AbstractProductB {
public void doSomething() {
System.out.println("產品B2的實現方法");
}
}
產品等級1的實體工廠類
public class Creator1 extends AbstractCreator {
public Creator1() {
System.out.println("工廠1創建");
}
// 只生產產品等級爲1的A類產品
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
// 只生產產品等級爲1的B類產品
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
產品等級2的實體工廠類
public class Creator2 extends AbstractCreator {
public Creator2() {
System.out.println("工廠2創建");
}
// 只生產產品等級爲2的A類產品
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
// 只生產產品等級爲2的B類產品
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
場景類
public class Client {
public static void main(String[] args) {
// 定義兩個工廠
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
//工廠生產產品
AbstractProductA a1 = creator1.createProductA();
AbstractProductA a2 = creator2.createProductA();
AbstractProductB b1 = creator1.createProductB();
AbstractProductB b2 = creator2.createProductB();
a1.doSomething();
a2.doSomething();
b1.doSomething();
b2.doSomething();
b1.shareMethod();
}
}
運行結果
工廠1創建
工廠2創建
產品A1的實現方法
產品A2的實現方法
產品B1的實現方法
產品B2的實現方法
每個產品共有的方法