《設計模式》-- 抽象工廠模式

抽象工廠

認識

抽象工廠是同時創建多個接口(多個產品)的實現類對象,實現解耦合

思考

  1. 抽象工廠模式能夠處理更加複雜的對象的細節封裝,可以對一個產品簇(多個接口)封裝細節,對外部調用實現透明。而簡單工廠模式和工廠方法模式都是對一個產品(一個接口)進行操作。
  2. 抽象工廠模式存在多個工廠實現類,可以結合簡單工廠模式,根據type創建不同的抽象工廠實現類,進一步封裝內部細節,進一步跟client端解耦合
  3. 一切複雜對象的創建都可以使用工廠模式

優缺點

  • 優點:
    1. 分離了接口和實現
    2. 封裝了內部實現細節
    3. 擴展新的工廠實現類容易,這需要再定義一個抽象工廠實現類
  • 缺點
    1. 擴展新的產品類難,當新增加一個產品接口的時候,就需要同時修改所有的工廠實現類的源代碼
    2. 容易造成類層次複雜

使用場景

當工廠模式需要在工廠方法中操作多個產品(接口)的時候使用抽象工廠模式

UML圖

工廠需要操作多個接口

image

代碼實現

/**
 * 產品接口 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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章