国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

工廠設計模式案例詳解,不服來辯!

開發 前端
工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一,今天我們一起來徹底解析一下它。

[[415212]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲 。轉載本文請聯系Java極客技術公眾號。

工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一,今天我們一起來徹底解析一下它。

一、介紹

從名稱上,顧名思義就是創建產品,按類別分為簡單工廠模式、工廠方法模式、抽象工廠模式,主要功能都是幫助我們把對象的實例化操作單獨抽取出來,優化系統架構,增強系統的擴展性。

下面,我們一起來看看各個模式的使用方式。

二、簡單工廠模式

簡單工廠模式,對象創建管理方式最為簡單,因為其僅僅簡單的對不同類對象的創建進行了一層薄薄的封裝。該模式通過向工廠傳遞類型來指定要創建的對象。

  • 創建一個接口
  1. public interface Product { 
  2.    void operation1(); 
  3.    void operation2(); 
  • 創建實現接口的實體類
  1. public class ConcreateProductA implements Product{ 
  2.  
  3.    @Override 
  4.    public void operation1() { 
  5.       System.out.println("產品A,執行任務1"); 
  6.    } 
  7.     
  8.    @Override 
  9.    public void operation2() { 
  10.       System.out.println("產品A,執行任務2"); 
  11.    } 
  1. public class ConcreateProductB implements Product{ 
  2.  
  3.    @Override 
  4.    public void operation1() { 
  5.       System.out.println("產品B,執行任務1"); 
  6.    } 
  7.     
  8.    @Override 
  9.    public void operation2() { 
  10.       System.out.println("產品B,執行任務2"); 
  11.    } 
  • 創建一個工廠,生成基于給定信息的實體類的對象
  1. public class SimpleFactory { 
  2.      
  3.    //使用 create 方法獲取形狀類型的對象 
  4.    public Product create(String productType){ 
  5.       if(productType == null){ 
  6.          return null
  7.       } 
  8.       if(productType.equalsIgnoreCase("productA")){ 
  9.          return new ConcreateProductA(); 
  10.       } 
  11.       if(productType.equalsIgnoreCase("productB")){ 
  12.          return new ConcreateProductB(); 
  13.       } 
  14.       return null
  15.    } 
  • 編寫客戶端測試類,使用該工廠,通過傳遞類型信息來獲取實體類的對象
  1. public class FactoryPatternDemo { 
  2.   
  3.    public static void main(String[] args) { 
  4.       SimpleFactory simpleFactory = new SimpleFactory(); 
  5.        
  6.       //獲取 productA 的對象 
  7.       Product productA = simpleFactory.create("productA"); 
  8.   
  9.       //調用 productA 的 operation1、operation2 方法 
  10.       productA.operation1(); 
  11.       productA.operation2(); 
  12.   
  13.       //獲取 productB 的對象 
  14.       Product productB = simpleFactory.create("productB"); 
  15.   
  16.       //調用 productB 的 operation1、operation2 方法 
  17.       productB.operation1(); 
  18.       productB.operation2(); 
  19.    } 
  • 執行程序,輸出結果:
  1. 產品A,執行任務1 
  2. 產品A,執行任務2 
  3. 產品B,執行任務1 
  4. 產品B,執行任務2 

當然,還可以將創建對象方式進行改進,將SimpleFactory類創建對象的方式改成如下方式:

  1. public class SimpleFactory { 
  2.      
  3.    //反射機制獲取實體類 
  4.    public <T> T createByClazzName(Class<? extends T> clazz){ 
  5.   T obj = null
  6.   try { 
  7.    obj = (T) Class.forName(clazz.getName()).newInstance(); 
  8.   } catch (Exception e) { 
  9.    // TODO Auto-generated catch block 
  10.    e.printStackTrace(); 
  11.   } 
  12.   return obj; 
  13.  } 

這樣做的好處是,當有新的產品加入時,不用修改工廠類,在調用的時候,采用如下方式即可獲取對象!

  1. Product product = new SimpleFactory().create("類名.class"); 

三、工廠方法模式

和簡單工廠模式中工廠負責生產所有產品相比,工廠方法模式將生成具體產品的任務分發給具體的產品工廠。

  • 創建一個工廠接口
  1. public interface FactoryProduct { 
  2.    Product create(); 
  • 創建實現接口的實體類
  1. public class ConcreateFactoryA implements FactoryProduct{ 
  2.  
  3.    @Override 
  4.    public Product create() { 
  5.       return new ConcreateProductA(); 
  6.    } 
  1. public class ConcreateFactoryB implements FactoryProduct{ 
  2.  
  3.    @Override 
  4.    public Product create() { 
  5.       return new ConcreateProductB(); 
  6.    } 
  • 編寫客戶端測試類,使用該工廠,通過傳遞類型信息來獲取實體類的對象
  1. public class FactoryPatternDemo { 
  2.  
  3.    public static void main(String[] args) { 
  4.  
  5.       //獲取 productA 的對象 
  6.       Product productA = new ConcreateFactoryA().create(); 
  7.  
  8.       //調用 productA 的 operation1、operation2 方法 
  9.       productA.operation1(); 
  10.       productA.operation2(); 
  11.  
  12.       //獲取 productB 的對象 
  13.       Product productA = new ConcreateFactoryB().create(); 
  14.  
  15.       //調用 productB 的 operation1、operation2 方法 
  16.       productB.operation1(); 
  17.       productB.operation2(); 
  18.    } 
  • 執行程序,輸出結果:
  1. 產品A,執行任務1 
  2. 產品A,執行任務2 
  3. 產品B,執行任務1 
  4. 產品B,執行任務2 

四、抽象工廠模式

抽象工廠模式主要是應對產品族概念提出來的。提供一個創建一系列相關或相互依賴的對象。

  • 為形狀創建一個接口
  1. public interface Shape { 
  2.    void draw(); 
  • 創建實現接口的實體類
  1. public class Rectangle implements Shape { 
  2.   
  3.    @Override 
  4.    public void draw() { 
  5.       System.out.println("Inside Rectangle::draw() method."); 
  6.    } 
  1. public class Square implements Shape { 
  2.   
  3.    @Override 
  4.    public void draw() { 
  5.       System.out.println("Inside Square::draw() method."); 
  6.    } 
  1. public class Circle implements Shape { 
  2.   
  3.    @Override 
  4.    public void draw() { 
  5.       System.out.println("Inside Circle::draw() method."); 
  6.    } 
  • 為顏色創建一個接口
  1. public interface Color { 
  2.    void fill(); 
  • 創建實現接口的實體類
  1. public class Red implements Color { 
  2.   
  3.    @Override 
  4.    public void fill() { 
  5.       System.out.println("Inside Red::fill() method."); 
  6.    } 
  1. public class Green implements Color { 
  2.   
  3.    @Override 
  4.    public void fill() { 
  5.       System.out.println("Inside Green::fill() method."); 
  6.    } 
  1. public class Blue implements Color { 
  2.   
  3.    @Override 
  4.    public void fill() { 
  5.       System.out.println("Inside Blue::fill() method."); 
  6.    } 
  • 為 Color 和 Shape 對象創建抽象類來獲取工廠
  1. public abstract class AbstractFactory { 
  2.    public abstract Color getColor(String color); 
  3.    public abstract Shape getShape(String shape) ; 
  • 創建擴展了 AbstractFactory 的工廠類,基于給定的信息生成實體類的對象
  1. public class ShapeFactory extends AbstractFactory { 
  2.      
  3.    @Override 
  4.    public Shape getShape(String shapeType){ 
  5.       if(shapeType == null){ 
  6.          return null
  7.       }         
  8.       if(shapeType.equalsIgnoreCase("CIRCLE")){ 
  9.          return new Circle(); 
  10.       } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ 
  11.          return new Rectangle(); 
  12.       } else if(shapeType.equalsIgnoreCase("SQUARE")){ 
  13.          return new Square(); 
  14.       } 
  15.       return null
  16.    } 
  17.     
  18.    @Override 
  19.    public Color getColor(String color) { 
  20.       return null
  21.    } 
  1. public class ColorFactory extends AbstractFactory { 
  2.      
  3.    @Override 
  4.    public Shape getShape(String shapeType){ 
  5.       return null
  6.    } 
  7.     
  8.    @Override 
  9.    public Color getColor(String color) { 
  10.       if(color == null){ 
  11.          return null
  12.       }         
  13.       if(color.equalsIgnoreCase("RED")){ 
  14.          return new Red(); 
  15.       } else if(color.equalsIgnoreCase("GREEN")){ 
  16.          return new Green(); 
  17.       } else if(color.equalsIgnoreCase("BLUE")){ 
  18.          return new Blue(); 
  19.       } 
  20.       return null
  21.    } 
  • 創建一個工廠創造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠
  1. public class FactoryProducer { 
  2.    public static AbstractFactory getFactory(String choice){ 
  3.       if(choice.equalsIgnoreCase("SHAPE")){ 
  4.          return new ShapeFactory(); 
  5.       } else if(choice.equalsIgnoreCase("COLOR")){ 
  6.          return new ColorFactory(); 
  7.       } 
  8.       return null
  9.    } 
  • 使用 FactoryProducer 來獲取 AbstractFactory,通過傳遞類型信息來獲取實體類的對象
  1. public class AbstractFactoryPatternDemo { 
  2.    public static void main(String[] args) { 
  3.   
  4.       //獲取形狀工廠 
  5.       AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); 
  6.   
  7.       //獲取形狀為 Circle 的對象 
  8.       Shape shape1 = shapeFactory.getShape("CIRCLE"); 
  9.   
  10.       //調用 Circle 的 draw 方法 
  11.       shape1.draw(); 
  12.   
  13.       //獲取形狀為 Rectangle 的對象 
  14.       Shape shape2 = shapeFactory.getShape("RECTANGLE"); 
  15.   
  16.       //調用 Rectangle 的 draw 方法 
  17.       shape2.draw(); 
  18.        
  19.       //獲取形狀為 Square 的對象 
  20.       Shape shape3 = shapeFactory.getShape("SQUARE"); 
  21.   
  22.       //調用 Square 的 draw 方法 
  23.       shape3.draw(); 
  24.   
  25.       //獲取顏色工廠 
  26.       AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR"); 
  27.   
  28.       //獲取顏色為 Red 的對象 
  29.       Color color1 = colorFactory.getColor("RED"); 
  30.   
  31.       //調用 Red 的 fill 方法 
  32.       color1.fill(); 
  33.   
  34.       //獲取顏色為 Green 的對象 
  35.       Color color2 = colorFactory.getColor("Green"); 
  36.   
  37.       //調用 Green 的 fill 方法 
  38.       color2.fill(); 
  39.   
  40.       //獲取顏色為 Blue 的對象 
  41.       Color color3 = colorFactory.getColor("BLUE"); 
  42.   
  43.       //調用 Blue 的 fill 方法 
  44.       color3.fill(); 
  45.    } 
  • 執行程序,輸出結果:
  1. Inside Circle::draw() method. 
  2. Inside Rectangle::draw() method. 
  3. Inside Square::draw() method. 
  4. Inside Red::fill() method. 
  5. Inside Green::fill() method. 
  6. Inside Blue::fill() method. 

五、應用

工廠模式在實際開發中使用非常頻繁,例如 JDK 中的日歷操作,在國際化的時候,獲取本地語言就用到簡單工廠模式。

寫一個獲取測試,如下:

  1. public static void main(String[] args) { 
  2.     //獲取日歷操作類 
  3.     Calendar calendar = Calendar.getInstance(); 
  4.  
  5.     int year = calendar.get(Calendar.YEAR); 
  6.     // 取月份要加1 
  7.     int month = calendar.get(Calendar.MONTH) + 1; 
  8.     int day = calendar.get(Calendar.DAY_OF_MONTH); 
  9.     int hour = calendar.get(Calendar.HOUR_OF_DAY); 
  10.     int minute = calendar.get(Calendar.MINUTE); 
  11.     int seconds = calendar.get(Calendar.SECOND); 
  12.     // 1-7分別代表 -- 星期日,星期一,星期二,星期三,星期四,星期五,星期六 
  13.     int week = calendar.get(calendar.DAY_OF_WEEK); 
  14.  
  15.     // 年-月-日 
  16.     System.out.println("year = " + year); 
  17.     System.out.println("month = " + month); 
  18.     System.out.println("day = " + day); 
  19.     //時-分-秒 
  20.     System.out.println("hour = " + hour); 
  21.     System.out.println("minute = " + minute); 
  22.     System.out.println("seconds = " + seconds); 
  23.  
  24.     // 星期 
  25.     System.out.println("week = " + week); 

進入getInstance()方法,在獲取日歷類型的時候,內容如下:

六、小結

工廠模式中,重要的是工廠類,而不是產品類。產品類可以是多種形式,多層繼承或者是單個類都是可以的。

但要明確的,工廠模式的接口只會返回一種類型的實例,這是在設計產品類的時候需要注意的,最好是有父類或者共同實現的接口。

上面介紹的三種工廠模式有各自的應用場景,實際應用時能解決問題滿足需求即可!

七、參考

1、菜鳥教程 - 工廠模式 

2、博客園 - alpha_panda - 設計模式之工廠模式

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2014-12-19 10:09:47

2022-01-12 13:33:25

工廠模式設計

2021-03-06 22:50:58

設計模式抽象

2020-08-21 07:23:50

工廠模式設計

2011-11-17 16:03:05

Java工廠模式Clojure

2021-09-29 13:53:17

抽象工廠模式

2020-10-19 09:28:00

抽象工廠模式

2010-04-19 09:30:00

工廠模式PHP設計模式

2009-01-15 10:55:29

JavaScript設計模式抽象工廠

2022-05-09 08:04:50

工廠模式設計模式

2010-10-09 09:25:35

Python工廠模式

2024-07-31 08:12:33

2013-11-26 16:29:22

Android設計模式

2011-07-28 09:50:58

設計模式

2015-11-03 09:43:43

avascript設計模式工廠模式

2019-08-16 10:46:46

JavaScript工廠模式抽象工廠模式

2024-09-23 08:30:48

2020-08-11 11:20:30

Typescript設計模式

2024-09-14 08:24:44

設計模式抽象工廠模式JDK

2021-06-29 08:54:23

設計模式代理模式遠程代理
點贊
收藏

51CTO技術棧公眾號

91黄色在线| 九九**精品视频免费播放| 日韩电影不卡一区| 小小影院久久| 欧美在线黄色| 国产精品综合二区| 亚洲高清久久久久久| 欧美日韩免费高清| 美女视频免费一区| 欧美俄罗斯性视频| 精品久久影视| 成人福利视频网站| 99re在线| 91传媒视频在线播放| gogogo免费高清日本写真| 极品av在线| 亚洲私人黄色宅男| 成人3d动漫一区二区三区91| 日韩久久精品| 国产一区二区日韩| 四虎影视2018在线播放alocalhost| 天天躁日日躁成人字幕aⅴ| 欧美日韩在线免费| 免费成人在线视频网站| 欧美一级黄色录像片| 最新国产在线观看| 欧美xxxxx在线视频| 国产精品探花在线观看| 国产精品99一区二区| 中文乱码免费一区二区| 国产精品美女黄网| 露出调教综合另类| 色小说视频一区| 欧美aaaxxxx做受视频| 日本成人在线电影网| 不卡的av一区| 亚洲第一会所001| 2019中文字幕免费视频| 亚洲国产国产亚洲一二三| 影音先锋成人资源网站| 成视频在线免费观看| 99久久夜色精品国产亚洲1000部| 国产精品成人免费电影| 日韩图片一区| 免费一区二区三区在线观看| 欧美日韩成人高清| 日韩欧美ww| 黄色特一级视频| 欧美性极品少妇| 亚洲高清在线一区| 一区二区不卡视频| 亚洲超碰97人人做人人爱| 欧美人与性动交xxⅹxx| 99热在线国产| 一区二区三区.www| 亚洲精品第一| 91视频免费在线| 国产精品s色| 亚洲va欧美va国产综合剧情| 精品国产一区二区三区久久久樱花| 亚洲男人av在线| 最大av网站| 亚洲丝袜自拍清纯另类| 久久精品香蕉视频| 中文在线资源观看网站视频免费不卡| 天天操,天天操| 色综合久久中文字幕综合网| 欧美女子与性| 最新热久久免费视频| 激情综合网五月激情| 成人av网站在线| 成人频在线观看| 91热门视频在线观看| 国产日韩一区二区在线观看| 亚洲人成网站色在线观看| 视频二区在线| 亚洲一区二区国产| 国产经典一区| 国产精品美女无圣光视频| 亚洲一区二区三区四区五区午夜 | 成人看片黄a免费看视频| 国产精品一区一区三区| 亚洲国产欧美日韩| 久久久久久久久久美女| 精品国产三区在线| 国内精彩免费自拍视频在线观看网址 | 欧美午夜精品一区| 免费av在线电影| 一区二区欧美在线| 亚洲91网站| 日韩一区二区三区高清免费看看| 黄色成人在线视频| 亚洲精品日韩av| 色婷婷av一区二区三区软件| 久久夜色精品国产噜噜av小说| www.亚洲天堂网| 欧美最顶级的aⅴ艳星| 亚洲一二三级电影| 日本欧美视频| 国内精品在线视频| 92看片淫黄大片看国产片| 91高清视频免费看| 久久精品人人做人人爽电影蜜月| 欲香欲色天天天综合和网| 一二三四中文字幕| 亚洲人免费视频| 26uuu另类欧美亚洲曰本| 国产精品一区二区三区av | 91精品精品| 二区视频在线| 成人字幕网zmw| 日韩成人小视频| 亚洲视频在线一区二区| 成人搞黄视频| 国产污污在线观看| 久久99精品久久久久久三级 | 99久久国产宗和精品1上映| 国产精品高潮在线| 日韩一级片在线播放| 国内久久精品视频| 澳门av一区二区三区| 日韩精品电影网站| 欧美一区二区三区精品电影| 亚洲欧美激情一区二区| 卡一精品卡二卡三网站乱码| 三级外国片在线观看视频| 欧美第一黄网| 久久久久久亚洲精品| 色婷婷综合久久久久中文一区二区| 亚洲综合日韩| 日韩护士脚交太爽了| 欧美人xxx| 欧美xxx.com| 粗暴91大变态调教| 国产精品久久久久999| 欧美日产国产成人免费图片| 日韩一卡二卡三卡| 久久久一区二区三区捆绑**| 日韩激情啪啪| 国产精品一区二区三区视频网站| 在线免费观看成人网| 国产精品一区二区免费| 日韩一区二区三区四区| 国产99久久久久久免费看农村| 日韩精品久久久久久久软件91| www在线观看播放免费视频日本| 一级网站免费观看| 欧美丰满少妇xxxxx做受| 日韩精品在线播放| 国产·精品毛片| 日韩毛片视频| 中文字幕久久精品一区二区| 好吊色欧美一区二区三区| 欧美成人黄色小视频| 欧美日韩成人综合天天影院 | 91久久夜色精品国产按摩| 国产精品亚洲一区二区三区在线观看| 久cao在线| 嫩草伊人久久精品少妇av杨幂| aaa大片在线观看| 亚洲最大成人在线观看| 久久久性生活视频| 国产精品久久波多野结衣| 51精品国产人成在线观看| 成人免费观看a| 一区二区三区偷拍| 亚洲欧洲日本精品| 日本一二区视频| 日本免费不卡| 宅男网站在线免费观看| 四虎影视精品永久在线观看| jizz性欧美23| 欧美激情四色| 青青草精品视频| 中文字幕日韩欧美一区二区三区| 色av成人天堂桃色av| 色婷婷综合中文久久一本| 在线成人小视频| 久久久成人av| 国产亚洲欧美一区二区三区| 视频二区一区| 超碰在线94| 中文av在线全新| 在线看成人短视频| 免费精品视频| 中文字幕一区二区三区色视频 | 久久久久免费视频| 久久综合九九| 国产.com| 国产精品蜜月aⅴ在线| 午夜在线视频观看日韩17c| 888久久久| 国产精品自在欧美一区| 欧美日韩一本到| 久久久精品久久| 精品免费二区三区三区高中清不卡| 成年人免费大片| 亚洲欧美一级| 日韩电影在线观看电影| 在线观看欧美精品|