抽象工廠
認識
抽象工廠是同時創建多個接口(多個產品)的實現類對象,實現解耦合
思考
- 抽象工廠模式能夠處理更加複雜的對象的細節封裝,可以對一個產品簇(多個接口)封裝細節,對外部調用實現透明。而簡單工廠模式和工廠方法模式都是對一個產品(一個接口)進行操作。
- 抽象工廠模式存在多個工廠實現類,可以結合簡單工廠模式,根據type創建不同的抽象工廠實現類,進一步封裝內部細節,進一步跟client端解耦合
- 一切複雜對象的創建都可以使用工廠模式
優缺點
- 優點:
- 分離了接口和實現
- 封裝了內部實現細節
- 擴展新的工廠實現類容易,這需要再定義一個抽象工廠實現類
- 缺點
- 擴展新的產品類難,當新增加一個產品接口的時候,就需要同時修改所有的工廠實現類的源代碼
- 容易造成類層次複雜
使用場景
當工廠模式需要在工廠方法中操作多個產品(接口)的時候使用抽象工廠模式
UML圖
工廠需要操作多個接口
代碼實現
/**
* 產品接口 A
*
*/
public interface IProductA {
public void operation();
}
/**
* 產品實現類A1
*/
public class ConcreateProductA1 implements IProductA{
public void operation() {
System.out.println("創建產品A1");
}
}
/**
* 產品實現類A2
*/
public class ConcreateProductA2 implements IProductA{
public void operation() {
System.out.println("創建產品2");
}
}
/**
* 產品接口B
*
*/
public interface IProductB {
public void operation();
}
/**
* 產品實現類B1
*/
public class ConcreateProductB1 implements IProductB{
public void operation() {
System.out.println("創建產品B1");
}
}
/**
* 產品實現類B2
*/
public class ConcreateProductB2 implements IProductB{
public void operation() {
System.out.println("創建產品B2");
}
}
/**
* 抽象工廠類
*
*/
public abstract class Factory {
/**
* 定義抽象,具體實現延遲到子類中實現
*/
protected abstract IProductA getProductA();
protected abstract IProductB getProductB();
/**
* 提供方法供客戶端調用
*/
public void createProduct(){
//進行操作
IProductA productA = this.getProductA();
IProductB productB = this.getProductB();
//進行操作
}
}
public class ConcreateFacotry1 extends Factory{
/**
* 實現類中創建對應的productA的子類返回
*/
@Override
protected IProductA getProductA() {
return new ConcreateProductA1();
}
/**
* 實現類中創建對應的productB的子類返回
*/
@Override
protected IProductB getProductB() {
return new ConcreateProductB1();
}
}
public class ConcreateFacotry2 extends Factory{
/**
* 實現類中創建對應的productA的子類返回
*/
@Override
protected IProductA getProductA() {
return new ConcreateProductA2();
}
/**
* 實現類中創建對應的productB的子類返回
*/
@Override
protected IProductB getProductB() {
return new ConcreateProductB2();
}
}
/**
* 客戶端調用
*/
public class Client{
public static void main(String[] args) {
//客戶端調用 Factory的 ConcreateFacotry1 實現類創建對象
Factory factory1 = new ConcreateFacotry1();
factory1.createProduct();
//客戶端調用 Factory的 ConcreateFacotry2 實現類創建對象
Factory factory2 = new ConcreateFacotry2();
factory2.createProduct();
}
}