二維碼
        企資網(wǎng)

        掃一掃關(guān)注

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

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

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

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

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

        一、介紹

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

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

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

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

      1. 創(chuàng)建一個(gè)接口
        public interface Product {   void operation1();   void operation2();}
      2. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類(lèi)
        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");   }}
      3. 創(chuàng)建一個(gè)工廠,生成基于給定信息的實(shí)體類(lèi)的對(duì)象
        public class SimpleFactory {       //使用 create 方法獲取形狀類(lèi)型的對(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;   }}
      4. 編寫(xiě)客戶端測(cè)試類(lèi),使用該工廠,通過(guò)傳遞類(lèi)型信息來(lái)獲取實(shí)體類(lèi)的對(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();   }}
      5. 執(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類(lèi)創(chuàng)建對(duì)象的方式改成如下方式:

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

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

        三、工廠方法模式

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

      6. 創(chuàng)建一個(gè)工廠接口
        public interface FactoryProduct {   Product create();}
      7. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類(lèi)
        public class ConcreateFactoryA implements FactoryProduct{   @Override   public Product create() {      return new ConcreateProductA();   }}
        public class ConcreateFactoryB implements FactoryProduct{   @Override   public Product create() {      return new ConcreateProductB();   }}
      8. 編寫(xiě)客戶端測(cè)試類(lèi),使用該工廠,通過(guò)傳遞類(lèi)型信息來(lái)獲取實(shí)體類(lèi)的對(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();   }}
      9. 執(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)品族概念提出來(lái)的。提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴的對(duì)象。

      10. 為形狀創(chuàng)建一個(gè)接口
        public interface Shape {   void draw();}
      11. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類(lèi)
        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.");   }}
      12. 為顏色創(chuàng)建一個(gè)接口
        public interface Color {   void fill();}
      13. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類(lèi)
        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.");   }}
      14. 為 Color 和 Shape 對(duì)象創(chuàng)建抽象類(lèi)來(lái)獲取工廠
        public abstract class AbstractFactory {   public abstract Color getColor(String color);   public abstract Shape getShape(String shape) ;}
      15. 創(chuàng)建擴(kuò)展了 AbstractFactory 的工廠類(lèi),基于給定的信息生成實(shí)體類(lèi)的對(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;   }}
      16. 創(chuàng)建一個(gè)工廠創(chuàng)造器/生成器類(lèi),通過(guò)傳遞形狀或顏色信息來(lái)獲取工廠
        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;   }}
      17. 使用 FactoryProducer 來(lái)獲取 AbstractFactory,通過(guò)傳遞類(lèi)型信息來(lái)獲取實(shí)體類(lèi)的對(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();   }}
      18. 執(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í)際開(kāi)發(fā)中使用非常頻繁,例如 JDK 中的日歷操作,在國(guó)際化的時(shí)候,獲取本地語(yǔ)言就用到簡(jiǎn)單工廠模式。

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

        public static void main(String[] args) {    //獲取日歷操作類(lèi)    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()方法,在獲取日歷類(lèi)型的時(shí)候,內(nèi)容如下:

        六、小結(jié)

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

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

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

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

      19.  
        (文/王恒)
        免責(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)或其他問(wè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

        反饋

        用戶
        反饋

        主站蜘蛛池模板: 韩国一区二区视频| 91福利视频一区| 国99精品无码一区二区三区| 亚洲福利电影一区二区?| 亚洲欧洲一区二区三区| 精品一区精品二区制服| 动漫精品专区一区二区三区不卡 | 无码免费一区二区三区免费播放| 在线免费一区二区| 亚洲国产福利精品一区二区 | 国产精品毛片VA一区二区三区| 中文字幕乱码人妻一区二区三区| 日韩精品无码免费一区二区三区 | 精品视频一区二区三区四区五区| 国产精品一区二区香蕉| 亚洲AV无码一区二区一二区| 精品国产福利一区二区| 人妻体体内射精一区二区| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国产在线视频一区二区三区98| 立川理惠在线播放一区| 国产免费一区二区三区VR| 日韩欧美一区二区三区免费观看| 国产精品夜色一区二区三区 | 国产萌白酱在线一区二区| 亚洲熟女www一区二区三区| 国产精品香蕉一区二区三区| 国产精品久久久久久麻豆一区| 99久久精品午夜一区二区| 久久精品无码一区二区三区免费| 无码少妇一区二区浪潮免费| 在线|一区二区三区| 久久精品免费一区二区喷潮 | 免费无码一区二区三区蜜桃| 国产自产V一区二区三区C| 久久久久人妻精品一区| 精品熟人妻一区二区三区四区不卡| 中文字幕av人妻少妇一区二区 | 日韩在线视频一区二区三区| 国产精品成人99一区无码| 激情综合丝袜美女一区二区|