摘要:所謂的產品族,一般或多或少的都存在一定的關聯,抽象工廠模式就可以在類內部對產品族的關聯關系進行定義和描述,而不必專門引入一個新的類來進行管理。
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
抽象工廠中的元素
工廠接口:在抽象工廠模式中,工廠接口定義了同一類型的工廠可以生產多種不同的產品,定義了產品的種類。當工廠生成的種類發生變化時,要調整接口中的方法,這里違反了開閉原則,但是擴展不同類型的工廠,只需要實現接口就可以了。
工廠實現類:定義了具體的工廠以及具體生成的類型,有多少中類型的工廠,就有多少個具體的實現類。
具體產品的抽象類:一個工廠有可能生產出不同的產品,抽象類定義工廠生產產品的種類,抽象工廠接口中有多少個方法,就有多少個抽象類。
具體產品的實現:最后得到的具體產品,決定了產品在客戶端中的具體行為。
0x02.適用場景客戶端(應用層)不依賴于產品類實例如何被創建,實現等細節
強調一系列相關的產品對象(屬于同一產品族)一起使用創建對象需要大量重復的代碼
提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴于具體實現
0x03.優點具體產品在應用層代碼隔離,無需關心創建細節
將一個系列的產品族統一到一起創建
在類的內部對產品族進行約束。所謂的產品族,一般或多或少的都存在一定的關聯,抽象工廠模式就可以在類內部對產品族的關聯關系進行定義和描述,而不必專門引入一個新的類來進行管理。
0x04.缺點規定了所有可能被創建的產品集合,產品族中擴展新的產品困難,需要修改抽象工廠的接口
增加了系統的抽象性和理解難度
0x05.產品等級結構與產品族介紹
以家用電器為例:
美的:空調,熱水器,冰箱,洗衣機
海爾:空調,熱水器,冰箱,洗衣機
美的的全部產品屬于一個產品族
美的的熱水器和海爾的熱水器屬于一個產品等級
美的和海爾屬于不同的工廠
空調,熱水器,冰箱,洗衣機屬于同一工廠生產的不同產品
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類圖
0x07.源碼中的抽象工廠
java.sql.Connection
Statement
PreparedStatement
java.sql.Statement
executorSet
MyBatis: SqlSessionFactory
0x08.源碼地址抽象工廠模式: https://github.com/sigmako/design-pattern/tree/master/abstract-factory
0x09.參考慕課網設計模式精講: https://coding.imooc.com/class/270.html
23種設計模式(3):抽象工廠模式: https://blog.csdn.net/zhengzhb/article/details/7359385
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74846.html
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的...
摘要:但本質是,簡單工廠并未嚴格遵循設計模式的開閉原則,當需要增加新產品時也需要修改工廠代碼。但是工廠方法則嚴格遵守開閉原則,模式只負責抽象工廠接口,具體工廠交給客戶去擴展。 最近開展了三次設計模式的公開課,現在來總結一下設計模式在PHP中的應用,這是第二篇創建型模式之工廠模式。 設計模式的一般介紹在第一篇文章講了,這里就不重復。 工廠模式 實現:定義一個用于創建對象的接口,讓子類決定實...
摘要:主要詳解簡單工廠模式到抽象工廠模式的演變。抽象工廠模式當一個類別的產品還有多個系列區分時,為了按系列生產商品,使用抽象工廠區分。 主要詳解簡單工廠模式到抽象工廠模式的演變。 簡單工廠模式 即靜態工廠模式1.將對象的創建和使用分開;2.將生產過程集中,便于集中管理;3.當需要創建的對象類有變動時,就不用在所有new 的地方修改了,直接修改工廠類即可; /** * 簡單工廠模式 ---...
閱讀 2650·2023-04-26 00:42
閱讀 2799·2021-09-24 10:34
閱讀 3810·2021-09-24 09:48
閱讀 4145·2021-09-03 10:28
閱讀 2576·2019-08-30 15:56
閱讀 2771·2019-08-30 15:55
閱讀 3254·2019-08-29 12:46
閱讀 2244·2019-08-28 17:52