精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

設計模式系列—抽象工廠模式

系統
本篇和大家一起來學習抽象工廠模式相關內容。

 前言

  • 23種設計模式速記
  • 單例(singleton)模式
  • 工廠方法(factory method)模式

前面說完了工廠方法模式,我們發現工廠方法模式存在一個嚴重的問題:一個具體工廠只能創建一類產品 ,而實際過程中一個工廠往往需要生產多類產品。為了解決上述問題,可以使用抽象工廠模式,本篇和大家一起來學習抽象工廠模式相關內容。

模式定義
抽象工廠模式,即Abstract Factory Pattern,提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類;具體的工廠負責實現具體的產品實例。

抽象工廠模式是工廠方法模式的升級版本,工廠方法模式只生產一個等級的產品,而抽象工廠模式可生產多個等級的產品。

解決的問題
每個工廠只能創建一類產品

即工廠方法模式的缺點

模式組成
抽象工廠模式同工廠方法模式一樣,也是由抽象工廠、具體工廠、抽象產品和具體產品等 4 個要素構成,但抽象工廠中方法個數不同,抽象產品的個數也不同。現在我們來分析其基本結構和實現方法。

使用步驟

  1. 創建抽象工廠類,定義具體工廠的公共接口;
  2. 創建抽象產品族類 ,定義抽象產品的公共接口;
  3. 創建抽象產品類 (繼承抽象產品族類),定義具體產品的公共接口;
  4. 創建具體產品類(繼承抽象產品類) & 定義生產的具體產品;
  5. 創建具體工廠類(繼承抽象工廠類),定義創建對應具體產品實例的方法;

客戶端通過實例化具體的工廠類,并調用其創建不同目標產品的方法創建不同具體產品類的實例
實例說明
實例概況

  • 背景:隔壁老王有兩間塑料加工廠(A廠僅生產容器類產品;B廠僅生產模具類產品);隨著客戶需求的變化,A廠所在地的客戶需要也模具類產品,B廠所在地的客戶也需要容器類產品;
  • 沖突:沒有資源(資金+租位)在當地分別開設多一家注塑分廠
  • 解決方案:在原有的兩家塑料廠里增設生產需求的功能,即A廠能生產容器+模具產品;B廠間能生產模具+容器產品。

即抽象工廠模式

使用步驟

步驟1: 創建抽象工廠類,定義具體工廠的公共接口。

  1. abstract class Factory{ 
  2.     public abstract AbstractProduct ManufactureContainer(); 
  3.     public abstract AbstractProduct ManufactureMould(); 

步驟2: 創建抽象產品族類 ,定義具體產品的公共接口。

  1. abstract class AbstractProduct{ 
  2.     public abstract void method1(); 

步驟3: 創建抽象產品類 ,定義具體產品的公共接口。

  1. //容器產品抽象類 
  2. abstract class ContainerProduct extends AbstractProduct { 
  3.     @Override 
  4.     public abstract void method1(); 
  5.  
  6. //模具產品抽象類 
  7. abstract class MouldProduct extends AbstractProduct { 
  8.     @Override 
  9.     public abstract void method1(); 

步驟4: 創建具體產品類(繼承抽象產品類), 定義生產的具體產品。

  1. //容器產品A類 
  2. class ContainerProductA extends ContainerProduct{ 
  3.     @Override 
  4.     public void method1() { 
  5.         System.out.println("生產出了容器產品A"); 
  6.     } 
  7.  
  8. //容器產品B類 
  9. class ContainerProductB extends ContainerProduct{ 
  10.     @Override 
  11.     public void method1() { 
  12.         System.out.println("生產出了容器產品B"); 
  13.     } 
  14.  
  15. //模具產品A類 
  16. class MouldProductA extends MouldProduct{ 
  17.  
  18.     @Override 
  19.     public void method1() { 
  20.         System.out.println("生產出了模具產品A"); 
  21.     } 
  22.  
  23. //模具產品B類 
  24. class MouldProductB extends MouldProduct{ 
  25.  
  26.     @Override 
  27.     public void method1() { 
  28.         System.out.println("生產出了模具產品B"); 
  29.     } 

步驟5:創建具體工廠類(繼承抽象工廠類),定義創建對應具體產品實例的方法。

  1. //A廠 - 生產模具+容器產品 
  2. class FactoryA extends Factory{ 
  3.  
  4.     @Override 
  5.     public AbstractProduct ManufactureContainer() { 
  6.         return new ContainerProductA(); 
  7.     } 
  8.  
  9.     @Override 
  10.     public AbstractProduct ManufactureMould() { 
  11.         return new MouldProductA(); 
  12.     } 
  13.  
  14. //B廠 - 生產模具+容器產品 
  15. class FactoryB extends Factory{ 
  16.  
  17.     @Override 
  18.     public AbstractProduct ManufactureContainer() { 
  19.         return new ContainerProductB(); 
  20.     } 
  21.  
  22.     @Override 
  23.     public AbstractProduct ManufactureMould() { 
  24.         return new MouldProductB(); 
  25.     } 

步驟6:客戶端通過實例化具體的工廠類,并調用其創建不同目標產品的方法創建不同具體產品類的實例。

  1. public class AbstractFactoryPattern { 
  2.  
  3.     public static void main(String[] args){ 
  4.         FactoryA mFactoryA = new FactoryA(); 
  5.         FactoryB mFactoryB = new FactoryB(); 
  6.         //A廠當地客戶需要容器產品A 
  7.         mFactoryA.ManufactureContainer().method1(); 
  8.         //A廠當地客戶需要模具產品A 
  9.         mFactoryA.ManufactureMould().method1(); 
  10.  
  11.         //B廠當地客戶需要容器產品B 
  12.         mFactoryB.ManufactureContainer().method1(); 
  13.         //B廠當地客戶需要模具產品B 
  14.         mFactoryB.ManufactureMould().method1(); 
  15.  
  16.     } 

輸出結果

  1. 生產出了容器產品A 
  2. 生產出了模具產品A 
  3. 生產出了容器產品B 
  4. 生產出了模具產品B 

優點

  • 可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理。
  • 當需要產品族時,抽象工廠可以保證客戶端始終只使用同一個產品的產品組。
  • 抽象工廠增強了程序的可擴展性,當增加一個新的產品族時,不需要修改原代碼,滿足開閉原則。

缺點
當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。增加了系統的抽象性和理解難度。

這是因為抽象工廠接口中已經確定了可以被創建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。

對于新的產品族符合開-閉原則;對于新的產品種類不符合開-閉原則,這一特性稱為開-閉原則的傾斜性。

應用場景
程序需要處理不同系列的相關產品,但是您不希望它依賴于這些產品的具體類時,可以使用抽象工廠。

源碼中的應用

  1. #JDK 
  2. java.sql.Connection 
  3. java.sql.Driver 
  4.  
  5. # mybatis 
  6. SqlSessionFactory 

java.sql.Connection

  1. public interface Connection  extends Wrapper, AutoCloseable { 
  2.  //...      
  3.      //返回普通的sql執行器 
  4.         Statement createStatement() throws SQLException; 
  5.   //返回具有參數化預編譯功能的sql執行器 
  6.      PreparedStatement prepareStatement(String sql) throws SQLException; 
  7.      //返回可以執行存儲過程的sql執行器 
  8.         CallableStatement prepareCall(String sql) throws SQLException;    
  9.     //...          

從上面的注釋就可以看出,這就是典型的抽象工廠接口,描述了不同的產品等級Statement、PreparedStatement、CallableStatement,它們都位于抽象接口Statement產品等級結構中。我們可以繼續尋找該抽象工廠接口的實現類。

以Mysql為例,可以找到Mysql對這個工廠接口的實現類ConnectionImpl,ConnectionImpl并不是直接實現了java.sql.Connection,而是通過實現自己擴展的MySQLConnection接口,該接口也是間接繼承了java.sql.Connection

  1. public class ConnectionImpl extends ConnectionPropertiesImpl implements MySQLConnection { 
  2.  //... 
  3.  
  4.  public java.sql.Statement createStatement() throws SQLException { 
  5.         return createStatement(DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY); 
  6.     } 
  7.     
  8.  public java.sql.PreparedStatement prepareStatement(String sql) throws SQLException { 
  9.         return prepareStatement(sql, DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY); 
  10.     } 
  11.      
  12.  public java.sql.CallableStatement prepareCall(String sql) throws SQLException { 
  13.  
  14.         return prepareCall(sql, DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY); 
  15.     } 
  16.   
  17.  //... 

以createStatement為例,跟蹤其調用代碼可以看到StatementImpl這個類就是實現了java.sql.Statement的具體產品類

  1. public java.sql.Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { 
  2.     checkClosed(); 
  3.  
  4.     StatementImpl stmt = new StatementImpl(getMultiHostSafeProxy(), this.database); 
  5.     stmt.setResultSetType(resultSetType); 
  6.     stmt.setResultSetConcurrency(resultSetConcurrency); 
  7.  
  8.     return stmt; 

SqlSessionFactory

  1. /** 
  2.  * Creates an {@link SqlSession} out of a connection or a DataSource 
  3.  *  
  4.  * @author Clinton Begin 
  5.  */ 
  6. public interface SqlSessionFactory { 
  7.  
  8.   SqlSession openSession(); 
  9.  
  10.   SqlSession openSession(boolean autoCommit); 
  11.   SqlSession openSession(Connection connection); 
  12.   SqlSession openSession(TransactionIsolationLevel level); 
  13.  
  14.   SqlSession openSession(ExecutorType execType); 
  15.   SqlSession openSession(ExecutorType execType, boolean autoCommit); 
  16.   SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level); 
  17.   SqlSession openSession(ExecutorType execType, Connection connection); 
  18.  
  19.   Configuration getConfiguration(); 
  20.  

SqlSessionFactory也是抽象工廠接口,Configuration和SqlSession都是在不同的產品等級上。通過IDEA工具可以通過UML圖清晰得看到SqlSessionFactory的工廠實現類

以上兩個例子都和數據庫操作相關,同樣使用了抽象工廠模式。在jdbc中,客戶端通過Connection工廠獲取到Statement產品對象,然后通過該對象進行增刪改查操作,對于mybatis這種數據庫操縱框架而言(底層也是封裝了jdbc api)有異曲同工,通過SeqSessionFactory工廠獲取到SqlSession產品對象,然后進行增刪改查操作。

 

PS:以上代碼提交在 Github :

https://github.com/Niuh-Study/niuh-designpatterns.git

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-09-29 13:53:17

抽象工廠模式

2022-01-12 13:33:25

工廠模式設計

2021-03-06 22:50:58

設計模式抽象

2009-01-15 10:55:29

JavaScript設計模式抽象工廠

2011-07-28 09:50:58

設計模式

2013-11-26 16:29:22

Android設計模式

2020-12-17 09:38:16

設計模式參數

2024-03-06 13:19:19

工廠模式Python函數

2024-09-14 08:24:44

設計模式抽象工廠模式JDK

2020-08-21 07:23:50

工廠模式設計

2011-11-17 16:03:05

Java工廠模式Clojure

2020-09-14 17:26:48

抽象工廠模式

2023-08-07 06:30:15

抽象工廠模式軟件設計模式

2021-07-06 08:59:18

抽象工廠模式

2010-04-19 09:30:00

工廠模式PHP設計模式

2020-11-03 13:05:18

命令模式

2020-11-04 08:54:54

狀態模式

2020-10-23 09:40:26

設計模式

2024-07-31 08:12:33

2010-10-09 09:25:35

Python工廠模式
點贊
收藏

51CTO技術棧公眾號

成人国产一区二区三区精品麻豆| 亚洲天堂中文网| 在线播放一区二区精品视频| 亚洲高清一区二区三区| 狠狠色综合网站久久久久久久| 日韩欧美高清在线观看| 中文有码一区| 欧美色精品天天在线观看视频| 一级二级三级欧美| 成人福利小视频| 亚洲精品精选| 亚洲欧美日韩天堂一区二区| 天天综合网日韩| av香蕉成人| www.在线成人| 国产精品久久久久久久久男| 日本黄色免费片| 成人福利免费在线观看| 色狠狠色噜噜噜综合网| 九九久久九九久久| 免费一级在线观看播放网址| 九色|91porny| 欧美亚洲第一区| 国产中文字幕久久| 国产精品videossex| 日本道色综合久久| 久久人妻无码一区二区| 你懂的免费在线观看| 激情文学综合插| 8090成年在线看片午夜| 亚洲a∨无码无在线观看| 国产福利一区二区精品秒拍| 日本高清无吗v一区| 成人免费在线网| 成在在线免费视频| av在线不卡网| 国产在线拍偷自揄拍精品| 97超碰人人干| 久久久久国产精品| 亚洲欧美精品在线| 69亚洲乱人伦| 只有精品亚洲| 在线观看亚洲精品| 久久久亚洲精品无码| 免费观看成人高潮| 国产视频不卡一区| 国产一区再线| 99精品国产99久久久久久97| 丝袜亚洲另类欧美综合| 国内精品久久久久久中文字幕| 欧美一级片在线视频| 欧美日韩播放| 日韩av在线免播放器| 在线成人精品视频| 97精品资源在线观看| 日本韩国一区二区三区| 99精品人妻少妇一区二区| 婷婷av在线| 亚洲免费观看高清| 伊人久久av导航| 国产高清视频在线观看| 91小视频免费观看| 国产偷久久久精品专区| 国产综合视频在线| 国产99久久久国产精品| 成人在线中文字幕| 国产乱码精品一区二区| 久久精品国产秦先生| 国产精品美女www爽爽爽视频| www.伊人久久| 日韩午夜精品| 高清一区二区三区日本久| 久久高清无码视频| 欧美日韩精品一本二本三本| 久久成人在线视频| 极品颜值美女露脸啪啪| 欧美1区2区| 久久久国产成人精品| 欧美日韩色视频| 亚洲成人免费| 久久99久久99精品免观看粉嫩| 波多野结衣不卡视频| 女人天堂亚洲aⅴ在线观看| 欧美另类高清videos| 久久精品国产av一区二区三区| 午夜精品久久久久99热蜜桃导演 | 日韩午夜av电影| 亚洲国产欧美日韩在线| 中文字幕一区二区三区中文字幕| 日韩欧美一区二区视频| 国产精品熟妇一区二区三区四区| 成人盗摄视频| 亚洲人成五月天| 欧美xxxx精品| 亚洲人体av| 久久久久久一区二区三区| 国产又大又黄又粗| 男人的天堂亚洲一区| 91在线播放国产| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 91网站最新网址| 日韩激情视频| 欧美大片黄色| 一本到高清视频免费精品| 羞羞的视频在线| 亚洲一级大片| 亚洲欧美日韩图片| 老女人性淫交视频| 每日更新成人在线视频| 91久久精品久久国产性色也91| 性中国xxx极品hd| 久久久综合精品| 亚洲自拍三区| av中文资源在线资源免费观看| 欧日韩精品视频| 亚洲精品久久久久久| 国产成人短视频在线观看| 九九精品在线视频| 国产第一页在线观看| 国产成人精品1024| 日韩欧美在线电影| ririsao久久精品一区| 欧美三级电影在线观看| 日本wwwwwww| 日韩国产综合| 91高清在线免费观看| 99久久精品免费看国产交换| 久久免费国产精品| 日韩成人手机在线| 日韩黄色在线| 日韩成人高清在线| 欧美日韩在线观看成人| 美女爽到高潮91| 国产美女99p| 激情视频在线观看| 欧美在线免费观看亚洲| www.日本高清| 午夜欧美理论片| 国产免费一区二区三区在线能观看| 手机在线不卡av| 亚洲激情图片一区| 久热在线视频观看| 日韩国产专区| 国产精品黄页免费高清在线观看| 隣の若妻さん波多野结衣| 中文字幕在线一区| 少妇网站在线观看| 北条麻妃国产九九九精品小说| 91国内揄拍国内精品对白| 成 人 黄 色 片 在线播放| 国产精品视频麻豆| 男人搞女人网站| 伊人久久大香线蕉无限次| 91极品女神在线| 欧美一区二区三区黄片| 亚洲一区二区三区不卡国产欧美| 亚洲综合伊人久久| 羞羞答答成人影院www| 国产精品色悠悠| 国产精品一二三区视频| 色婷婷亚洲综合| 丰满少妇一区二区三区| 国产亚洲毛片在线| 蜜桃传媒视频麻豆第一区免费观看 | 66精品视频在线观看| 久久视频免费观看| 国产精品国产三级国产aⅴ| 国产精品女上位| 超碰成人在线播放| 国产精品福利在线观看播放| 国产情人节一区| 日本中文字幕伦在线观看| 欧美日韩视频不卡| 日本成人精品视频| 国产一区二区三区av电影| dy888午夜| 亚洲高清在线一区| 久久免费国产精品1| 深爱激情五月婷婷| 日韩人在线观看| 99精品欧美一区二区| 看片的网站亚洲| 久久最新免费视频| 美日韩黄色大片| 日韩av第一页| 1024国产在线| 日韩欧美123| 日本熟妇一区二区| 久久久激情视频| 日韩av在线中文| 欧美日本在线| 久久综合中文色婷婷| 国产亚洲人成a在线v网站 | 国产精品免费一区豆花| 久操视频在线| 亚洲国产成人精品电影| 天干夜夜爽爽日日日日| 17c精品麻豆一区二区免费| 成人三级做爰av| 性娇小13――14欧美| 亚洲一区二区三区午夜| 日韩精品久久久久久久软件91| 97视频网站入口| 国产高清自拍视频在线观看| 日韩美女在线视频| jizz国产在线观看| 亚洲靠逼com| 国产男男chinese网站| 精品在线播放免费| 中文字幕无码精品亚洲35| 日韩激情一区| 久久精品99| av在线精品| 欧美亚洲另类在线| 亚洲图区一区| 在线一区二区日韩| 人妻精品无码一区二区| 欧美日韩精品一区二区三区四区| 国产亚洲成人av| 国产精品情趣视频| 无码人妻精品一区二区三区温州| 久久国产夜色精品鲁鲁99| 日韩欧美不卡在线| 天天综合亚洲| 日本日本精品二区免费| jizz国产精品| 成人免费午夜电影| 偷拍中文亚洲欧美动漫| 久久久久久久999精品视频| 日韩成人影视| 亚洲性视频网站| 手机看片国产1024| 精品国精品国产尤物美女| 亚洲中文字幕在线观看| 色综合亚洲欧洲| 国产精选第一页| 亚洲精品视频在线看| 国产三级黄色片| 久久综合九色综合97婷婷| 极品白嫩的小少妇| 国产乱人伦偷精品视频免下载| 中文字幕一区二区三区四区在线视频 | 精品久久人人做人人爽| 影音先锋国产资源| 一本久道久久综合中文字幕| 国产精品久久久免费视频| 夜夜嗨av一区二区三区网页| 国产福利视频网站| 亚洲欧洲一区二区三区| 四虎成人免费影院| 国产女同互慰高潮91漫画| 免费人成又黄又爽又色| 91麻豆高清视频| 丰满大乳奶做爰ⅹxx视频| 不卡视频一二三| 性一交一黄一片| 国产精品一二三在| 老女人性生活视频| 国产麻豆日韩欧美久久| 国产三级精品三级在线| 美国av一区二区| 91视频这里只有精品| 老司机精品视频导航| 中文字幕永久有效| 久久99国产精品免费网站| 国产美女无遮挡网站| 在线视频免费在线观看一区二区| 久久在线中文字幕| 国产精品www994| 超碰97在线看| 欧美区国产区| 一区二区在线中文字幕电影视频| 91精品国产乱码久久久久久久 | 中文字字幕在线观看| 91久久精品午夜一区二区| 中文在线观看av| 欧美午夜寂寞影院| 中文字幕一区二区免费| 91精品国产一区二区人妖| 国产精品探花视频| 欧美一区二区日韩| 少妇精品视频一区二区| 日韩国产精品亚洲а∨天堂免| 天天干视频在线| 亚洲欧美国产一本综合首页| 北岛玲日韩精品一区二区三区| 伊人伊成久久人综合网站| 黄网站在线免费看| 欧美激情亚洲激情| 老色鬼在线视频| 国产精品久久久久久搜索| 久久91视频| 亚洲精品日韩av| 精品午夜电影| 欧美福利精品| 成人a'v在线播放| 成人在线观看www| 极品尤物久久久av免费看| 少妇高潮喷水在线观看| 美腿丝袜亚洲三区| 在线成人免费av| 99r国产精品| 亚洲天堂av中文字幕| 一区二区欧美国产| www亚洲视频| 在线播放中文字幕一区| 粉嫩小泬无遮挡久久久久久| 精品在线欧美视频| 成人影院在线观看| 午夜精品在线视频| 激情亚洲影院在线观看| 99在线观看视频网站| 中文字幕伦av一区二区邻居| 香蕉视频在线网址| 久久激情综合| 性欧美在线视频| bt欧美亚洲午夜电影天堂| 99久久久无码国产精品衣服| 国产精品视频一二三区| 久久精品视频免费在线观看| 精品久久久视频| 波多野结衣一二区| 欧美成人精品3d动漫h| 99青草视频在线播放视| 欧美黑人性视频| www.成人在线视频| 国产一区再线| 亚洲精品在线观看91| 国产精品亚洲a| 久久精品国产亚洲一区二区三区| japanese在线观看| 国产精品白丝在线| 在线视频精品免费| 亚洲高清一区二| 免费看美女视频在线网站| 欧美精品xxx| 懂色aⅴ精品一区二区三区| 欧美精品七区| 狠狠色综合网| 激情黄色小视频| 欧美国产一区在线| 日本免费在线观看视频| 欧美一卡2卡三卡4卡5免费| eeuss影院www在线观看| 欧美专区福利在线| 天天久久夜夜| 日韩小视频网站| 加勒比av一区二区| 国产精品久久久久久久av| 疯狂欧美牲乱大交777| 精品人妻av一区二区三区| 精品国偷自产在线视频99| 亚洲黄色中文字幕| 国产高清在线一区二区| 韩国自拍一区| 在线视频观看91| **欧美大码日韩| 亚洲一区中文字幕永久在线| 亚洲日韩欧美视频| 久久青青视频| 久久精品日韩| 亚洲一区二区网站| 一本加勒比波多野结衣| 一区二区三区日本| 亚洲精品国产精品国| 久久99国产综合精品女同| 国产va免费精品观看精品| 国产精品av免费| 激情综合色播五月| 欧美精品久久久久性色| 日韩午夜在线播放| 亚洲wwwww| 国产伦精品一区二区三区高清版 | 日韩精品免费一区二区夜夜嗨 | 成人av网址在线观看| 久久久久人妻一区精品色欧美| 日韩欧美中文字幕一区| 日本动漫理论片在线观看网站| www.久久爱.cn| 欧美激情无毛| 三级视频网站在线观看| 欧美日韩国产激情| 日韩专区一区二区| 国产精品免费视频xxxx| 天天揉久久久久亚洲精品| 日韩av影视大全| 亚洲精品视频一区| 免费av一级片| 国产成人精品网站| 日韩中文欧美| 少妇极品熟妇人妻无码| 午夜精品在线视频一区| 青青草娱乐在线| 国产精品香蕉av| 在线中文一区| 成人性生活免费看| 欧美性猛片aaaaaaa做受| 欧美激情午夜| 国产欧美一区二区三区另类精品| 麻豆精品网站|