<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網(wǎng)

      掃一掃關(guān)注

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

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

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

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

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

      一、介紹

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

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

      二、簡(jiǎn)單工廠模式

      簡(jiǎn)單工廠模式,對(duì)象創(chuàng)建管理方式最為簡(jiǎn)單,因?yàn)槠鋬H僅簡(jiǎn)單的對(duì)不同類對(duì)象的創(chuàng)建進(jìn)行了一層薄薄的封裝。該模式通過向工廠傳遞類型來指定要?jiǎng)?chuàng)建的對(duì)象。

    • 創(chuàng)建一個(gè)接口
      public interface Product {   void operation1();   void operation2();}
    • 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類
      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)建一個(gè)工廠,生成基于給定信息的實(shí)體類的對(duì)象
      public class SimpleFactory {       //使用 create 方法獲取形狀類型的對(duì)象   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;   }}
    • 編寫客戶端測(cè)試類,使用該工廠,通過傳遞類型信息來獲取實(shí)體類的對(duì)象
      public class FactoryPatternDemo {    public static void main(String[] args) {      SimpleFactory simpleFactory = new SimpleFactory();            //獲取 productA 的對(duì)象      Product productA = simpleFactory.create("productA");       //調(diào)用 productA 的 operation1、operation2 方法      productA.operation1();      productA.operation2();       //獲取 productB 的對(duì)象      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)建對(duì)象方式進(jìn)行改進(jìn),將SimpleFactory類創(chuàng)建對(duì)象的方式改成如下方式:

      public class SimpleFactory {       //反射機(jī)制獲取實(shí)體類   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)品加入時(shí),不用修改工廠類,在調(diào)用的時(shí)候,采用如下方式即可獲取對(duì)象!

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

      三、工廠方法模式

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

    • 創(chuàng)建一個(gè)工廠接口
      public interface FactoryProduct {   Product create();}
    • 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類
      public class ConcreateFactoryA implements FactoryProduct{   @Override   public Product create() {      return new ConcreateProductA();   }}
      public class ConcreateFactoryB implements FactoryProduct{   @Override   public Product create() {      return new ConcreateProductB();   }}
    • 編寫客戶端測(cè)試類,使用該工廠,通過傳遞類型信息來獲取實(shí)體類的對(duì)象
      public class FactoryPatternDemo {   public static void main(String[] args) {      //獲取 productA 的對(duì)象      Product productA = new ConcreateFactoryA().create();      //調(diào)用 productA 的 operation1、operation2 方法      productA.operation1();      productA.operation2();      //獲取 productB 的對(duì)象      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)對(duì)產(chǎn)品族概念提出來的。提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴的對(duì)象。

    • 為形狀創(chuàng)建一個(gè)接口
      public interface Shape {   void draw();}
    • 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類
      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)建一個(gè)接口
      public interface Color {   void fill();}
    • 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類
      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 對(duì)象創(chuàng)建抽象類來獲取工廠
      public abstract class AbstractFactory {   public abstract Color getColor(String color);   public abstract Shape getShape(String shape) ;}
    • 創(chuàng)建擴(kuò)展了 AbstractFactory 的工廠類,基于給定的信息生成實(shí)體類的對(duì)象
      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)建一個(gè)工廠創(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,通過傳遞類型信息來獲取實(shí)體類的對(duì)象
      public class AbstractFactoryPatternDemo {   public static void main(String[] args) {       //獲取形狀工廠      AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");       //獲取形狀為 Circle 的對(duì)象      Shape shape1 = shapeFactory.getShape("CIRCLE");       //調(diào)用 Circle 的 draw 方法      shape1.draw();       //獲取形狀為 Rectangle 的對(duì)象      Shape shape2 = shapeFactory.getShape("RECTANGLE");       //調(diào)用 Rectangle 的 draw 方法      shape2.draw();            //獲取形狀為 Square 的對(duì)象      Shape shape3 = shapeFactory.getShape("SQUARE");       //調(diào)用 Square 的 draw 方法      shape3.draw();       //獲取顏色工廠      AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");       //獲取顏色為 Red 的對(duì)象      Color color1 = colorFactory.getColor("RED");       //調(diào)用 Red 的 fill 方法      color1.fill();       //獲取顏色為 Green 的對(duì)象      Color color2 = colorFactory.getColor("Green");       //調(diào)用 Green 的 fill 方法      color2.fill();       //獲取顏色為 Blue 的對(duì)象      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)用

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

      寫一個(gè)獲取測(cè)試,如下:

      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);    //時(shí)-分-秒    System.out.println("hour = " + hour);    System.out.println("minute = " + minute);    System.out.println("seconds = " + seconds);    // 星期    System.out.println("week = " + week);}

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

      六、小結(jié)

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

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

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

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

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

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

      粵ICP備16078936號(hào)

      微信

      關(guān)注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯(lián)系
      客服

      聯(lián)系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號(hào): weishitui

      客服001 客服002 客服003

      工作時(shí)間:

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

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 亚洲国产成人精品无码区在线网站 | 色噜噜亚洲男人的天堂| 最近中文字幕视频高清| 国产精品免费观看| 亚洲国产精品一区二区三区久久 | 日韩精品在线观看视频| 国产成人精品福利网站在线| 亚洲免费黄色网址| 福利网址在线观看| 桃花直播下载免费观看| 国产激情一区二区三区四区| 亚洲AV综合色区无码一区| 天天躁夜夜躁狂狂躁综合| 极品丝袜乱系列集合大全目录| 国产盗摄女厕美女嘘嘘在线观看 | 欧美黑人巨大videos极品| 国色天香精品一卡2卡3卡| 亚洲欧美日韩高清在线看| 5555国产在线观看精品| 欧美亚洲综合另类| 国产成人无码免费看片软件 | 欧美伊人久久久久久久久影院| 欧美人与动人物乱大交| 国产精品宾馆在线| 五月天久久婷婷| 青娱乐精品视频| 成人在线欧美亚洲| 国产亚洲精品无码专区| 丰满多毛的陰户视频| 精品国产免费人成网站| 天天影院良辰美景好时光电视剧| 亚洲色成人www永久网站| 东北疯狂xxxxbbbb中国| 精品一区精品二区制服| 在线亚洲人成电影网站色www| 亚洲国产成人精品无码区在线观看| 99re6在线| 成品大香煮伊在2021一| 伊人色综合一区二区三区| 1000部拍拍拍18免费网站 | 在线a毛片免费视频观看|