精品久久久久久久久中文字幕_成人在线免费观看视视频_成人久久精品视频_热99精品里视频精品_日韩国产欧美精品在线_色多多国产成人永久免费网站_国产一区二区三区18_日韩美女免费观看_亚洲va久久久噜噜噜_亚洲精品一区二区在线_亚洲福利视频在线_中文字幕亚洲情99在线_91精品久久久久久久久久久久久_欧美日韩成人在线观看_日本精品视频在线播放_97视频在线观看播放

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁 » 企資快訊 » 辦公 » 正文

最全工廠設(shè)計模式案例詳解,不服來辯

放大字體  縮小字體 發(fā)布日期:2021-08-21 03:03:57    作者:王恒    瀏覽次數(shù):59
導(dǎo)讀

工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計模式之一,今天我們一起來徹底解析一下她。一、介紹從名稱上,顧名思義就是創(chuàng)建產(chǎn)品,按類別分為簡單工廠模式、工廠方法模式、抽象工廠模式,主要功能都是幫助我

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

一、介紹

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

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

二、簡單工廠模式

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

  • 創(chuàng)建一個接口
    public interface Product {   void operation1();   void operation2();}
  • 創(chuàng)建實現(xiàn)接口的實體類
    public class ConcreateProductA implements Product{   @Override   public void operation1() {      System.out.println("產(chǎn)品A,執(zhí)行任務(wù)1");   }      @Override   public void operation2() {      System.out.println("產(chǎn)品A,執(zhí)行任務(wù)2");   }}
    public class ConcreateProductB implements Product{   @Override   public void operation1() {      System.out.println("產(chǎn)品B,執(zhí)行任務(wù)1");   }      @Override   public void operation2() {      System.out.println("產(chǎn)品B,執(zhí)行任務(wù)2");   }}
  • 創(chuàng)建一個工廠,生成基于給定信息的實體類的對象
    public class SimpleFactory {       //使用 create 方法獲取形狀類型的對象   public Product create(String productType){      if(productType == null){         return null;      }      if(productType.equalsIgnoreCase("productA")){         return new ConcreateProductA();      }      if(productType.equalsIgnoreCase("productB")){         return new ConcreateProductB();      }      return null;   }}
  • 編寫客戶端測試類,使用該工廠,通過傳遞類型信息來獲取實體類的對象
    public class FactoryPatternDemo {    public static void main(String[] args) {      SimpleFactory simpleFactory = new SimpleFactory();            //獲取 productA 的對象      Product productA = simpleFactory.create("productA");       //調(diào)用 productA 的 operation1、operation2 方法      productA.operation1();      productA.operation2();       //獲取 productB 的對象      Product productB = simpleFactory.create("productB");       //調(diào)用 productB 的 operation1、operation2 方法      productB.operation1();      productB.operation2();   }}
  • 執(zhí)行程序,輸出結(jié)果:
    產(chǎn)品A,執(zhí)行任務(wù)1產(chǎn)品A,執(zhí)行任務(wù)2產(chǎn)品B,執(zhí)行任務(wù)1產(chǎn)品B,執(zhí)行任務(wù)2

    當(dāng)然,還可以將創(chuàng)建對象方式進行改進,將SimpleFactory類創(chuàng)建對象的方式改成如下方式:

    public class SimpleFactory {       //反射機制獲取實體類   public <T> T createByClazzName(Class<? extends T> clazz){  T obj = null;  try {   obj = (T) Class.forName(clazz.getName()).newInstance();  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  return obj; }}

    這樣做的好處是,當(dāng)有新的產(chǎn)品加入時,不用修改工廠類,在調(diào)用的時候,采用如下方式即可獲取對象!

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

    三、工廠方法模式

    和簡單工廠模式中工廠負(fù)責(zé)生產(chǎn)所有產(chǎn)品相比,工廠方法模式將生成具體產(chǎn)品的任務(wù)分發(fā)給具體的產(chǎn)品工廠。

  • 創(chuàng)建一個工廠接口
    public interface FactoryProduct {   Product create();}
  • 創(chuàng)建實現(xiàn)接口的實體類
    public class ConcreateFactoryA implements FactoryProduct{   @Override   public Product create() {      return new ConcreateProductA();   }}
    public class ConcreateFactoryB implements FactoryProduct{   @Override   public Product create() {      return new ConcreateProductB();   }}
  • 編寫客戶端測試類,使用該工廠,通過傳遞類型信息來獲取實體類的對象
    public class FactoryPatternDemo {   public static void main(String[] args) {      //獲取 productA 的對象      Product productA = new ConcreateFactoryA().create();      //調(diào)用 productA 的 operation1、operation2 方法      productA.operation1();      productA.operation2();      //獲取 productB 的對象      Product productA = new ConcreateFactoryB().create();      //調(diào)用 productB 的 operation1、operation2 方法      productB.operation1();      productB.operation2();   }}
  • 執(zhí)行程序,輸出結(jié)果:
    產(chǎn)品A,執(zhí)行任務(wù)1產(chǎn)品A,執(zhí)行任務(wù)2產(chǎn)品B,執(zhí)行任務(wù)1產(chǎn)品B,執(zhí)行任務(wù)2

    四、抽象工廠模式

    抽象工廠模式主要是應(yīng)對產(chǎn)品族概念提出來的。提供一個創(chuàng)建一系列相關(guān)或相互依賴的對象。

  • 為形狀創(chuàng)建一個接口
    public interface Shape {   void draw();}
  • 創(chuàng)建實現(xiàn)接口的實體類
    public class Rectangle implements Shape {    @Override   public void draw() {      System.out.println("Inside Rectangle::draw() method.");   }}
    public class Square implements Shape {    @Override   public void draw() {      System.out.println("Inside Square::draw() method.");   }}
    public class Circle implements Shape {    @Override   public void draw() {      System.out.println("Inside Circle::draw() method.");   }}
  • 為顏色創(chuàng)建一個接口
    public interface Color {   void fill();}
  • 創(chuàng)建實現(xiàn)接口的實體類
    public class Red implements Color {    @Override   public void fill() {      System.out.println("Inside Red::fill() method.");   }}
    public class Green implements Color {    @Override   public void fill() {      System.out.println("Inside Green::fill() method.");   }}
    public class Blue implements Color {    @Override   public void fill() {      System.out.println("Inside Blue::fill() method.");   }}
  • 為 Color 和 Shape 對象創(chuàng)建抽象類來獲取工廠
    public abstract class AbstractFactory {   public abstract Color getColor(String color);   public abstract Shape getShape(String shape) ;}
  • 創(chuàng)建擴展了 AbstractFactory 的工廠類,基于給定的信息生成實體類的對象
    public class ShapeFactory extends AbstractFactory {       @Override   public Shape getShape(String shapeType){      if(shapeType == null){         return null;      }              if(shapeType.equalsIgnoreCase("CIRCLE")){         return new Circle();      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){         return new Rectangle();      } else if(shapeType.equalsIgnoreCase("SQUARE")){         return new Square();      }      return null;   }      @Override   public Color getColor(String color) {      return null;   }}
    public class ColorFactory extends AbstractFactory {       @Override   public Shape getShape(String shapeType){      return null;   }      @Override   public Color getColor(String color) {      if(color == null){         return null;      }              if(color.equalsIgnoreCase("RED")){         return new Red();      } else if(color.equalsIgnoreCase("GREEN")){         return new Green();      } else if(color.equalsIgnoreCase("BLUE")){         return new Blue();      }      return null;   }}
  • 創(chuàng)建一個工廠創(chuàng)造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠
    public class FactoryProducer {   public static AbstractFactory getFactory(String choice){      if(choice.equalsIgnoreCase("SHAPE")){         return new ShapeFactory();      } else if(choice.equalsIgnoreCase("COLOR")){         return new ColorFactory();      }      return null;   }}
  • 使用 FactoryProducer 來獲取 AbstractFactory,通過傳遞類型信息來獲取實體類的對象
    public class AbstractFactoryPatternDemo {   public static void main(String[] args) {       //獲取形狀工廠      AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");       //獲取形狀為 Circle 的對象      Shape shape1 = shapeFactory.getShape("CIRCLE");       //調(diào)用 Circle 的 draw 方法      shape1.draw();       //獲取形狀為 Rectangle 的對象      Shape shape2 = shapeFactory.getShape("RECTANGLE");       //調(diào)用 Rectangle 的 draw 方法      shape2.draw();            //獲取形狀為 Square 的對象      Shape shape3 = shapeFactory.getShape("SQUARE");       //調(diào)用 Square 的 draw 方法      shape3.draw();       //獲取顏色工廠      AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");       //獲取顏色為 Red 的對象      Color color1 = colorFactory.getColor("RED");       //調(diào)用 Red 的 fill 方法      color1.fill();       //獲取顏色為 Green 的對象      Color color2 = colorFactory.getColor("Green");       //調(diào)用 Green 的 fill 方法      color2.fill();       //獲取顏色為 Blue 的對象      Color color3 = colorFactory.getColor("BLUE");       //調(diào)用 Blue 的 fill 方法      color3.fill();   }}
  • 執(zhí)行程序,輸出結(jié)果:
    Inside Circle::draw() method.Inside Rectangle::draw() method.Inside Square::draw() method.Inside Red::fill() method.Inside Green::fill() method.Inside Blue::fill() method.

    五、應(yīng)用

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

    寫一個獲取測試,如下:

    public static void main(String[] args) {    //獲取日歷操作類    Calendar calendar = Calendar.getInstance();    int year = calendar.get(Calendar.YEAR);    // 取月份要加1    int month = calendar.get(Calendar.MONTH) + 1;    int day = calendar.get(Calendar.DAY_OF_MONTH);    int hour = calendar.get(Calendar.HOUR_OF_DAY);    int minute = calendar.get(Calendar.MINUTE);    int seconds = calendar.get(Calendar.SECOND);    // 1-7分別代表 -- 星期日,星期一,星期二,星期三,星期四,星期五,星期六    int week = calendar.get(calendar.DAY_OF_WEEK);    // 年-月-日    System.out.println("year = " + year);    System.out.println("month = " + month);    System.out.println("day = " + day);    //時-分-秒    System.out.println("hour = " + hour);    System.out.println("minute = " + minute);    System.out.println("seconds = " + seconds);    // 星期    System.out.println("week = " + week);}

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

    六、小結(jié)

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

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

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

    原文鏈接:https://mp.weixin.qq.com/s/uPl3MpA38ZwOwk6VWtdipA

  •  
    (文/王恒)
    免責(zé)聲明
    本文僅代表作發(fā)布者:王恒個人觀點,本站未對其內(nèi)容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

    粵ICP備16078936號

    微信

    關(guān)注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    国产免费av电影| 久草在线新免费首页资源站| 免费国产黄色片| 日本视频中文字幕| 亚洲人被黑人高潮完整版| 国产在线视频2019最新视频| 黄色录像特级片| 美腿丝袜在线亚洲一区| 中文字幕精品一区二区三区在线| 国产亚洲精品码| 日韩欧美专区| 自拍偷拍第9页| 91麻豆精品国产91久久久资源速度| 久久久久麻豆v国产| 亚洲熟妇av乱码在线观看| 你懂得在线观看| 国产夫妻性生活视频| 久久久天堂国产精品女人| 午夜性色福利影院| 高清精品视频| 伊人久久大香线蕉| 草民午夜欧美限制a级福利片| 91国产视频在线播放| 欧美日本韩国一区二区| 免费观看黄色av| 中日韩高清电影网| ●精品国产综合乱码久久久久| 日韩欧美精品在线观看| 九九在线免费视频| 亚洲麻豆精品| 欧美在线视频网站| 奇米一区二区三区av| 国产在线视频你懂得| 亚洲专区在线| 丝袜熟女一区二区三区| 久久久最新网址| 视频一区二区免费| 国产精品嫩草影院av蜜臀| 欧美日本中文字幕| 狼狼综合久久久久综合网| 亚洲成人久久网| 国产 高清 精品 在线 a| 久久黄色一级视频| 国产精品久久久久久久久毛片| 国产aⅴ超薄肉色丝袜交足| 欧美成人性色生活仑片| 青青草原网站在线观看| 欧美三片在线视频观看| 亚洲色图另类专区| 俺去亚洲欧洲欧美日韩| 影音先锋中文字幕在线观看| 一区二区三区日韩欧美精品| 国产一区二区视频免费观看| 伊甸园亚洲一区| 国产按摩一区二区三区| 狠狠干五月天| 欧美午夜三级| 欧美国产日韩在线观看成人| 亚洲天堂精品在线| 一区二区三区免费视频网站| 精品国模一区二区三区| 成人手机在线播放| 亚洲免费在线视频观看| 免费在线欧美视频| 国产福利在线视频| 思思99精品视频在线观看| 国产视频一区二区在线| 希岛爱理中文字幕| 久久99导航| 亚洲欧洲闷骚av少妇影院| 少妇高潮一区二区三区99| 琪琪久久久久日韩精品| 免费中国女人69xxxxx视频| 亚洲视频中文字幕| 色偷偷88欧美精品久久久| 麻豆精品久久| 97蜜桃久久| 欧美日韩在线成人| 久久精品盗摄| www.精品av.com| 免费免费啪视频在线观看| 欧美一级爆毛片| av福利精品导航| 欧美日韩国产亚洲一区| 日韩视频不卡| 91cn在线观看| 同房视频网站| 亚洲2020天天堂在线观看| 欧美va亚洲va在线观看蝴蝶网| 成人亚洲精品777777大片| 国产精品国模大尺度私拍| 亚洲最大成人综合| 中文字幕在线网| 日韩不卡一区| 亚洲熟女综合色一区二区三区| 一区二区三区 在线观看视频| 国产在线视频卡一卡二| 老太脱裤子让老头玩xxxxx| 成人av免费播放| 国产日韩在线亚洲字幕中文| 欧美三级视频| 欧美天天综合| 亚洲黄网在线观看| 亚洲韩国一区二区三区| 美女视频黄a视频全免费观看| 992tv成人国产福利在线| 韩国三级电影在线观看婷婷| 成人影视亚洲图片在线| 亚洲亚裔videos黑人hd| 不卡日本视频| 第一页在线观看| 在线视频资源站| 婷婷开心激情网| 欧美高清69hd| 亚洲 欧美 变态 另类 综合| 玖玖玖电影综合影院| 日韩av在线直播| 中文字幕高清在线| 欧美色图另类图片| 国产欧美日韩亚洲一区二区三区| 欧美日韩国产成人高清视频| 欧美午夜影院一区| 精品久久久久久久久中文字幕| 亚洲国产精品人人爽夜夜爽| 日本男女交配视频| 久久三级视频| 91亚洲精品视频| 精品久久久久久久久久久下田| 国产亚洲精品美女久久久久| 国产口爆吞精一区二区| av福利在线播放| 少妇人妻偷人精品一区二区| 在线观看成年人网站| 成人免费乱码大片a毛片软件| 精品国产一区二区三区小蝌蚪| 国产无套粉嫩白浆在线2022年| 日韩欧亚中文在线| 国产999精品久久| 国产91精品高潮白浆喷水| 色婷婷777777仙踪林| ass白嫩白嫩的小美女| 波多野结衣一区二区三区在线| 欧美激情中文字幕| 中文字幕在线免费不卡| 大型av综合网站| 先锋影音一区二区| 日韩在线视频免费看| 久久综合另类图片小说| 国产乱人伦偷精品视频不卡| 亚洲一区二区网站| 国产一区二区观看| 日韩伦理一区二区| 美女网站在线免费欧美精品| 中文字幕线观看| 精品精品视频| 免费欧美激情| √天堂资源地址在线官网| www在线观看免费视频| 亚洲性生活大片| 91精品国产黑色瑜伽裤| 欧美 国产 综合| 男人天堂av网| 国产www精品| 天堂资源中文在线| 亚洲欧美在线专区| 极品美女销魂一区二区三区| 成人乱码一区二区三区| 久久久精品国产亚洲| 国产一起色一起爱| 国产在线观看免费播放| 红桃一区二区三区| 国产日韩精品视频一区二区三区| 久久久久久亚洲综合| bdsm在线观看播放视频| 国产一区二区三区影院| 99re6这里只有精品视频在线观看| 亚洲激情播播| 亚洲精品白浆| 国产日韩专区在线| 国产精品视频一二三四区| 欧美性受xxxx免费视频| 久久久久久久久久久影视| 亚洲va韩国va欧美va精四季| 久久久久久久久97| 欧美日韩一区二区三区四区在线观看| 亚洲精品天堂成人片av在线播放| 色综合电影网| 欧美另类一区二区| 久久久激情视频| 国产高清一区二区三区| 欧美成人777| 9色精品在线| 91精品久久香蕉国产线看观看| 亚洲黑丝一区二区| 日韩三区视频| 韩国主播福利视频一区二区三区| 久久www成人_看片免费不卡| 欧美色国产精品| 毛片av在线| 欧美一区 二区 三区| 亚洲成人免费在线| 中文字幕一区二区三区最新| 国产丰满果冻videossex| 波多野结衣一区二区三区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 国产激情美女久久久久久吹潮| 亚洲天堂久久久久久久| 亚洲久久久久久| 在线人成动漫视频在线观看| 青青热久免费精品视频在线18| 亚洲精品aⅴ中文字幕乱码| 婷婷综合激情网| 成人亚洲欧美激情在线电影| 国产精品99精品一区二区三区∴| 国产精品人人爱一区二区白浆| 欧美激情videoshd| 91精品国产91久久久久久密臀| 天堂视频在线免费观看| 色天天综合久久久久综合片| 亚洲一区久久| 欧美日韩中文一区二区| 日韩毛片在线一区二区毛片| 天堂一区二区三区四区| 精品国产乱码久久久久久88av| 欧美激情一区二区三区久久久| 国产一区二区三区自拍| 成人毛片老司机大片| 欧美在线短视频| 美女脱光内衣内裤视频久久网站| 亚洲国产精品yw在线观看| 日韩精品a在线观看91| 亚洲美女欧洲| 国产丝袜一区二区三区免费视频| 日韩在线电影| 中文字幕精品在线不卡| 韩国美女主播一区| 亚洲一区av| 久久中文字幕电影| 久久先锋影音av| 久久久久久高潮国产精品视| 日韩在线观看视频一区二区| 欧美黄色a视频| 国产成人免费视频网站视频社区| 影音先锋国产在线| 亚洲男人7777| 亚洲国产精品无码久久久| 91福利在线观看视频| 成人免费a视频| 久久婷婷国产| 丰满大乳奶做爰ⅹxx视频| 日本一级淫片色费放| 那种视频在线观看| 日韩激情综合网| 日韩欧美中字| 日韩国产一区久久| 亚洲综合伊人| 天堂成人在线| 久久电影天堂| 久久久视频6r| 古典武侠综合av第一页| 一级毛片在线视频| 久青青在线观看视频国产| 狠狠色狠狠色综合网| 玖玖国产精品视频| 免费一级欧美在线观看视频| 波多野结衣在线中文| 亚洲一区二区三区免费在线观看| 久久久久久久久久久久国产| 777奇米四色成人影色区| 97最新国自产拍视频在线完整在线看| 97国产精品视频人人做人人爱| 国产亚洲精品bt天堂精选| 久久久久久国产精品免费播放| 天天做天天爱天天综合网2021| 欧美国产激情二区三区| 日本高清在线观看wwwww色| 精品国产伦一区二区三区观看说明| 91麻豆swag| 久久日文中文字幕乱码| 91在线短视频| 5566成人精品视频免费| 欧美日韩网站| 成年人视频在线观看免费| 国产男女爽爽爽| 麻豆传媒在线看| 九九免费精品视频在线观看| 日韩欧美卡一卡二| 欧美—级高清免费播放| 黄网站在线免费| 日韩成人网免费视频| 久久国产精品网站| 欧美精品一区二区久久婷婷| 天堂在线中文| 免费高潮视频95在线观看网站| 老司机免费在线视频| 99久久精品免费看国产| 国产精品自产拍在线网站| 欧美日韩dvd在线观看| 久久国产精品久久国产精品| 免费一级淫片aaa片毛片a级| 爱豆国产剧免费观看大全剧苏畅| 色婷婷综合久久久久中文一区二区| 日产国产高清一区二区三区| 尤物视频免费在线观看| 91蝌蚪视频在线观看| 蜜桃视频涩涩| 亚洲精品www久久久| 男人扒开美女尿口无遮挡图片| 天天操夜夜做| 99久久99九九99九九九| 亚洲人一区二区| 粉色视频免费看| 天天做天天爱天天综合网2021| 国产精品嫩草影院一区二区| 精品福利在线导航| 97视频在线观看免费| 亚洲国产影院| 亚洲裸体俱乐部裸体舞表演av| 日本五十路在线| 亚洲承认视频| 丰满人妻老熟妇伦人精品| 中文字幕第4页| 老色鬼精品视频在线观看播放| 新片速递亚洲合集欧美合集| 青青国产视频| 男女日批视频在线观看| 黄色成年人视频在线观看| 国产av国片精品|