<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      設(shè)計(jì)模式之工廠模式

      1.前言

      最近在看《大話設(shè)計(jì)模式》這本書(shū),雖然大學(xué)也學(xué)過(guò)設(shè)計(jì)模式,但是那時(shí)候還沒(méi)有進(jìn)行過(guò)開(kāi)發(fā),那么多的設(shè)計(jì)模式,看了也不知道用在哪種場(chǎng)景,最近又突然有時(shí)間了,就想著重新理解一遍軟件的設(shè)計(jì)模式,本篇博客的原地址為runoob

      2.工廠模式的簡(jiǎn)介

      工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
      在工廠模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端暴露創(chuàng)建邏輯,并且是通過(guò)使用一個(gè)共同的接口來(lái)指向新創(chuàng)建的對(duì)象。

      3.工廠模式的介紹

      意圖: 定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類自己決定實(shí)例化哪一個(gè)工廠類,工廠模式使其創(chuàng)建過(guò)程延遲到子類進(jìn)行。

      主要解決: 主要解決接口選擇的問(wèn)題。

      何時(shí)使用: 我們明確地計(jì)劃不同條件下創(chuàng)建不同實(shí)例時(shí)。

      如何解決: 讓其子類實(shí)現(xiàn)工廠接口,返回的也是一個(gè)抽象的產(chǎn)品。

      關(guān)鍵代碼: 創(chuàng)建過(guò)程在其子類執(zhí)行。

      應(yīng)用實(shí)例:

      1. 您需要一輛汽車,可以直接從工廠里面提貨,而不用去管這輛汽車是怎么做出來(lái)的,以及這個(gè)汽車?yán)锩娴木唧w實(shí)現(xiàn)。
      2. Hibernate 換數(shù)據(jù)庫(kù)只需換方言和驅(qū)動(dòng)就可以。

      優(yōu)點(diǎn):

      1. 一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象,只要知道其名稱就可以了。
      2. 擴(kuò)展性高,如果想增加一個(gè)產(chǎn)品,只要擴(kuò)展一個(gè)工廠類就可以。
      3. 屏蔽產(chǎn)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口。

      缺點(diǎn): 每次增加一個(gè)產(chǎn)品時(shí),都需要增加一個(gè)具體類和對(duì)象實(shí)現(xiàn)工廠,使得系統(tǒng)中類的個(gè)數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時(shí)也增加了系統(tǒng)具體類的依賴。這并不是什么好事。

      使用場(chǎng)景:

      1. 日志記錄器:記錄可能記錄到本地硬盤(pán)、系統(tǒng)事件、遠(yuǎn)程服務(wù)器等,用戶可以選擇記錄日志到什么地方。
      2. 數(shù)據(jù)庫(kù)訪問(wèn),當(dāng)用戶不知道最后系統(tǒng)采用哪一類數(shù)據(jù)庫(kù),以及數(shù)據(jù)庫(kù)可能有變化時(shí)。
      3. 設(shè)計(jì)一個(gè)連接服務(wù)器的框架,需要三個(gè)協(xié)議,"POP3"、"IMAP"、"HTTP",可以把這三個(gè)作為產(chǎn)品類,共同實(shí)現(xiàn)一個(gè)接口。

      注意事項(xiàng): 作為一種創(chuàng)建類模式,在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠方法模式。有一點(diǎn)需要注意的地方就是復(fù)雜對(duì)象適合使用工廠模式,而簡(jiǎn)單對(duì)象,特別是只需要通過(guò) new 就可以完成創(chuàng)建的對(duì)象,無(wú)需使用工廠模式。如果使用工廠模式,就需要引入一個(gè)工廠類,會(huì)增加系統(tǒng)的復(fù)雜度。

      4.工廠模式的實(shí)現(xiàn)

      我們將創(chuàng)建一個(gè) Shape 接口和實(shí)現(xiàn) Shape 接口的實(shí)體類。下一步是定義工廠類 ShapeFactory。
      FactoryPatternDemo,我們的演示類使用 ShapeFactory 來(lái)獲取 Shape 對(duì)象。它將向 ShapeFactory 傳遞信息(CIRCLE / RECTANGLE / SQUARE),以便獲取它所需對(duì)象的類型。
      UML類圖

      4.1 步驟1

      創(chuàng)建一個(gè)接口
      Shape.java

      public interface Shape {
         void draw();
      }
      

      4.2 步驟2

      創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類。
      Rectangle.java

      public class Rectangle implements Shape {
      
         @Override
         public void draw() {
            System.out.println("Inside Rectangle::draw() method.");
         }
      }
      

      Square.java

      public class Square implements Shape {
      
         @Override
         public void draw() {
            System.out.println("Inside Square::draw() method.");
         }
      }
      

      Circle.java

      public class Circle implements Shape {
      
         @Override
         public void draw() {
            System.out.println("Inside Circle::draw() method.");
         }
      }
      

      4.3 步驟3

      創(chuàng)建一個(gè)工廠,生成基于給定信息的實(shí)體類的對(duì)象。
      ShapeFactory.java

      public class ShapeFactory {
          
         //使用 getShape 方法獲取形狀類型的對(duì)象
         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;
         }
      }
      

      4.4步驟4

      使用該工廠,通過(guò)傳遞類型信息來(lái)獲取實(shí)體類的對(duì)象。
      FactoryPatternDemo.java

      public class FactoryPatternDemo {
      
         public static void main(String[] args) {
            ShapeFactory shapeFactory = new ShapeFactory();
      
            //獲取 Circle 的對(duì)象,并調(diào)用它的 draw 方法
            Shape shape1 = shapeFactory.getShape("CIRCLE");
      
            //調(diào)用 Circle 的 draw 方法
            shape1.draw();
      
            //獲取 Rectangle 的對(duì)象,并調(diào)用它的 draw 方法
            Shape shape2 = shapeFactory.getShape("RECTANGLE");
      
            //調(diào)用 Rectangle 的 draw 方法
            shape2.draw();
      
            //獲取 Square 的對(duì)象,并調(diào)用它的 draw 方法
            Shape shape3 = shapeFactory.getShape("SQUARE");
      
            //調(diào)用 Square 的 draw 方法
            shape3.draw();
         }
      }
      

      4.5 步驟5

      驗(yàn)證輸出。

      Inside Circle::draw() method.
      Inside Rectangle::draw() method.
      Inside Square::draw() method.
      
      posted @ 2024-07-09 17:38  booleandev  閱讀(32)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 欧洲精品免费一区二区三区| 中文国产日韩欧美二视频| 精品国产片一区二区三区| 久久五月丁香激情综合| 最新偷拍一区二区三区| 久久婷婷五月综合色欧美| 久久一卡二卡三卡四卡| 国产老熟女无套内射不卡| 国产熟女激情一区二区三区| 秋霞AV鲁丝片一区二区| 明光市| 亚洲欧美日韩综合一区二区| 亚洲爆乳WWW无码专区| 欧美人成精品网站播放| 污网站在线观看视频| 久久精品亚洲中文无东京热| 亚洲国产精品日韩av专区| 无码成人一区二区三区| 亚洲熟妇精品一区二区| 亚洲欧洲日产国产av无码| 精品人妻无码中文字幕在线| 不卡乱辈伦在线看中文字幕| 精品视频在线观自拍自拍| 久久综合国产精品一区二区| 久久无码高潮喷水| 精品乱码一区二区三四五区| 精品一区二区三区蜜桃久| 精品国产福利一区二区在线| 欧洲亚洲精品免费二区| 亚洲精品动漫免费二区| 国产乱子伦视频在线播放| 18禁超污无遮挡无码网址| 在线亚洲午夜片av大片| www欧美在线观看| 久久精品国产99精品亚洲| 精品久久人人妻人人做精品| 色噜噜狠狠成人综合| 亚洲AV成人一区国产精品| 久久人妻av无码中文专区| 欧美黑人乱大交| 香港日本三级亚洲三级|