設計模式之抽象工廠模式

0x01.定義與類型

  • 定義:抽象工廠模式提供一個建立一系列相關或相互依賴對象的接口
  • 無需指定它們具體的類
  • 類型:建立型
  • UML

抽象工廠方法

  • 基本java實現
/**
 * 工廠接口
 */
public interface IFactory {
    AProduct1 createProduct1();
    AProduct2 createProduct2();
}

/**
 * 產品1
 */
public abstract class AProduct1 {
    public abstract void produce();
}

/**
 * 產品2
 */
public abstract class AProduct2 {
    public abstract void produce();
}

/**
 * 工廠實現
 */
public class FactoryImpl implements IFactory {
    @Override
    public ProductImpl1 createProduct1() {
        return new ProductImpl1();
    }
    @Override
    public ProductImpl2 createProduct2() {
        return new ProductImpl2();
    }
}

/**
 * 產品1實現
 */
public class ProductImpl1 extends AProduct1 {
    @Override
    public void produce() {
        System.out.println("產品1");
    }
}

/**
 * 產品2實現
 */
public class ProductImpl2 extends AProduct2 {
    @Override
    public void produce() {
        System.out.println("產品2");
    }
}

/**
 * 測試與應用
 */
public class Test {
    public static void main(String[] args) {
        FactoryImpl factory = new FactoryImpl();
        ProductImpl1 productImpl1 = factory.createProduct1();
        ProductImpl2 productImpl2 = factory.createProduct2();
        productImpl1.produce();
        productImpl2.produce();
    }
}
  • 輸出結果
產品1
產品2
  • 抽象工廠中的元素html

    • 工廠接口:在抽象工廠模式中,工廠接口定義了同一類型的工廠能夠生產多種不一樣的產品,定義了產品的種類。當工廠生成的種類發生變化時,要調整接口中的方法,這裏違反了開閉原則,可是擴展不一樣類型的工廠,只須要實現接口就能夠了。
    • 工廠實現類:定義了具體的工廠以及具體生成的類型,有多少中類型的工廠,就有多少個具體的實現類。
    • 具體產品的抽象類:一個工廠有可能生產出不一樣的產品,抽象類定義工廠生產產品的種類,抽象工廠接口中有多少個方法,就有多少個抽象類。
    • 具體產品的實現:最後獲得的具體產品,決定了產品在客戶端中的具體行爲。

0x02.適用場景

  • 客戶端(應用層)不依賴於產品類實例如何被建立,實現等細節
  • 強調一系列相關的產品對象(屬於同一產品族)一塊兒使用建立對象須要大量重複的代碼
  • 提供一個產品類的庫,全部的產品以一樣的接口出現,從而使客戶端不依賴於具體實現

0x03.優勢

  • 具體產品在應用層代碼隔離,無需關心建立細節
  • 將一個系列的產品族統一到一塊兒建立
  • 在類的內部對產品族進行約束。所謂的產品族,通常或多或少的都存在必定的關聯,抽象工廠模式就能夠在類內部對產品族的關聯關係進行定義和描述,而沒必要專門引入一個新的類來進行管理。

0x04.缺點

  • 規定了全部可能被建立的產品集合,產品族中擴展新的產品困難,須要修改抽象工廠的接口
  • 增長了系統的抽象性和理解難度

0x05.產品等級結構與產品族介紹

產品等級結構
產品等級結構

  • 以家用電器爲例:java

    • 美的:空調,熱水器,冰箱,洗衣機
    • 海爾:空調,熱水器,冰箱,洗衣機
    • 美的的所有產品屬於一個產品族
    • 美的的熱水器和海爾的熱水器屬於一個產品等級
    • 美的海爾屬於不一樣的工廠
    • 空調,熱水器,冰箱,洗衣機屬於同一工廠生產的不一樣產品

0x06.樣例實現

簡介:慕課網的每一門課程都有手記和視頻等,課程又分Java課程,Python課程
  • 課程工廠類
//課程工廠
public interface ICourseFactory {
    Video getVideo();
    Article getArticle();
}
  • 文章/視頻抽象類
//文章抽象類
public abstract class Article {
    public abstract void produce();
}

//視頻抽象類
public abstract class Video {
    public abstract void produce();
}
  • Java課程的實現
//Java課程工廠
public class JavaCourseFactory implements ICourseFactory {
    @Override
    public JavaVideo getVideo() {
        return new JavaVideo();
    }

    @Override
    public JavaArticle getArticle() {
        return new JavaArticle();
    }
}

//Java視頻
public class JavaVideo extends Video {

    @Override
    public void produce() {
        System.out.println("錄製JAVA課程視頻");
    }
}

//Java文章
public class JavaArticle extends Article {
    @Override
    public void produce() {
        System.out.println("編寫Java課程手記");
    }
}
  • Python課程實現
//Python課程工廠
public class PythonCourseFactory implements ICourseFactory {
    @Override
    public Video getVideo() {
        return new PythonVideo();
    }

    @Override
    public Article getArticle() {
        return new PythonArticle();
    }
}

//Python視頻實現
public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("錄製Python視頻");
    }
}

//Python文章
public class PythonArticle extends Article {
    @Override
    public void produce() {
        System.out.println("編寫Python課程手記");
    }
}
  • 測試與應用類
public class Test {
    public static void main(String[] args) {
        //java 產品族
        ICourseFactory courseFactory = new JavaCourseFactory();
        Video video = courseFactory.getVideo();
        Article article = courseFactory.getArticle();
        video.produce();
        article.produce();
    }
}
  • 輸出結果
錄製JAVA課程視頻
編寫Java課程手記
  • 樣例UML類圖

樣例UML類圖

0x07.源碼中的抽象工廠

  • java.sql.Connectiongit

    • Statement
    • PreparedStatement
  • java.sql.Statementgithub

    • executorSet
  • MyBatis: SqlSessionFactory

0x08.源碼地址

0x09.參考

相關文章
相關標籤/搜索