免费人成动漫在线播放r18-免费人成观看在线网-免费人成黄页在线观看日本-免费人成激情视频在线观看冫-jlzzjlzz亚洲大全-jlzzjlzz亚洲日本

二維碼
企資網

掃一掃關注

當前位置: 首頁 » 企資快訊 » 辦公 » 正文

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

放大字體  縮小字體 發布日期:2021-08-21 03:03:57    作者:王恒    瀏覽次數:20
導讀

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

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

一、介紹

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

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

二、簡單工廠模式

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

  • 創建一個接口
    public interface Product {   void operation1();   void operation2();}
  • 創建實現接口的實體類
    public class ConcreateProductA implements Product{   @Override   public void operation1() {      System.out.println("產品A,執行任務1");   }      @Override   public void operation2() {      System.out.println("產品A,執行任務2");   }}
    public class ConcreateProductB implements Product{   @Override   public void operation1() {      System.out.println("產品B,執行任務1");   }      @Override   public void operation2() {      System.out.println("產品B,執行任務2");   }}
  • 創建一個工廠,生成基于給定信息的實體類的對象
    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");       //調用 productA 的 operation1、operation2 方法      productA.operation1();      productA.operation2();       //獲取 productB 的對象      Product productB = simpleFactory.create("productB");       //調用 productB 的 operation1、operation2 方法      productB.operation1();      productB.operation2();   }}
  • 執行程序,輸出結果:
    產品A,執行任務1產品A,執行任務2產品B,執行任務1產品B,執行任務2

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

    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; }}

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

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

    三、工廠方法模式

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

  • 創建一個工廠接口
    public interface FactoryProduct {   Product create();}
  • 創建實現接口的實體類
    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();      //調用 productA 的 operation1、operation2 方法      productA.operation1();      productA.operation2();      //獲取 productB 的對象      Product productA = new ConcreateFactoryB().create();      //調用 productB 的 operation1、operation2 方法      productB.operation1();      productB.operation2();   }}
  • 執行程序,輸出結果:
    產品A,執行任務1產品A,執行任務2產品B,執行任務1產品B,執行任務2

    四、抽象工廠模式

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

  • 為形狀創建一個接口
    public interface Shape {   void draw();}
  • 創建實現接口的實體類
    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.");   }}
  • 為顏色創建一個接口
    public interface Color {   void fill();}
  • 創建實現接口的實體類
    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 對象創建抽象類來獲取工廠
    public abstract class AbstractFactory {   public abstract Color getColor(String color);   public abstract Shape getShape(String shape) ;}
  • 創建擴展了 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;   }}
  • 創建一個工廠創造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠
    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");       //調用 Circle 的 draw 方法      shape1.draw();       //獲取形狀為 Rectangle 的對象      Shape shape2 = shapeFactory.getShape("RECTANGLE");       //調用 Rectangle 的 draw 方法      shape2.draw();            //獲取形狀為 Square 的對象      Shape shape3 = shapeFactory.getShape("SQUARE");       //調用 Square 的 draw 方法      shape3.draw();       //獲取顏色工廠      AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");       //獲取顏色為 Red 的對象      Color color1 = colorFactory.getColor("RED");       //調用 Red 的 fill 方法      color1.fill();       //獲取顏色為 Green 的對象      Color color2 = colorFactory.getColor("Green");       //調用 Green 的 fill 方法      color2.fill();       //獲取顏色為 Blue 的對象      Color color3 = colorFactory.getColor("BLUE");       //調用 Blue 的 fill 方法      color3.fill();   }}
  • 執行程序,輸出結果:
    Inside Circle::draw() method.Inside Rectangle::draw() method.Inside Square::draw() method.Inside Red::fill() method.Inside Green::fill() method.Inside Blue::fill() method.

    五、應用

    工廠模式在實際開發中使用非常頻繁,例如 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()方法,在獲取日歷類型的時候,內容如下:

    六、小結

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

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

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

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

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

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

    粵ICP備16078936號

    微信

    關注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯系
    客服

    聯系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

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

    反饋

    用戶
    反饋

    主站蜘蛛池模板: 日韩精品免费一区二区三区 | 永久在线| 一级女性全黄生活片免费看 | 一本大道香蕉在线影院 | 黑人精品videossex黑人 | 成人亚洲网站 | 黄色在线免费看 | 在线观看91精品国产性色 | 日韩精品视频免费在线观看 | 国产v国产v片大片线观看网站 | 欧美三区在线 | www我要色综合com | 精品一区二区三区影院在线午夜 | 欧美日韩一级大片 | 97人人爽人人爽人人人爽 | 九九热播视频 | 成人在线播放网站 | 欧美精品成人一区二区视频一 | 精品欧美一区二区在线观看 | 国产日韩精品欧美一区喷水 | 在线观看视频www | 亚洲欧美日本一区 | 91精品成人免费国产 | 日韩美女免费线视频网址 | x8x8国产日韩欧美 | 成人影库| 日韩欧美中文字幕一区二区三区 | 日韩亚洲欧洲在线com91tv | 又色又爽又黄的三级视频在线观看 | 一级毛片短视频 | 国产精品1区2区3区 国产精品1区 2区 3区 | 97av视频 | 亚洲va欧美va国产va天堂影 | 在线观看黄日本高清视频 | 日韩经典中文字幕 | 欧美在线视频你懂的 | 天天夜日日日日碰日日摸 | 黄色搞基网站 | 午夜影院伦理 | www.国产精品| 日本护士色xxxxx视频 |