Java基礎——工廠模式

来源:http://www.cnblogs.com/1693977889zz/archive/2017/07/01/7103500.html
-Advertisement-
Play Games

通過學習,一句話概括Java工廠模式的特點——通過建立一個工廠來創建對象,不必關心構造對象實例能不能被實例化啊等諸多細節和複雜過程。 工廠模式呢?就像我們從勞動密集型社會轉型到技術密集型社會。打個比方,從前要製造一個桌子,從上山選木頭、砍木頭、運木頭,到設計桌子,製造桌子等細節問題都需要一個人去做好 ...


通過學習,一句話概括Java工廠模式的特點——通過建立一個工廠來創建對象,不必關心構造對象實例能不能被實例化啊等諸多細節和複雜過程。

工廠模式呢?就像我們從勞動密集型社會轉型到技術密集型社會。打個比方,從前要製造一個桌子,從上山選木頭、砍木頭、運木頭,到設計桌子,製造桌子等細節問題都需要一個人去做好,由於付出的勞動成本極高和技術學成的時間等問題,一般一個木匠在創新方面有一定的局限性。後來,人們步入了工業時代,製造業的發展突飛猛進,另外,倡導分工細化。比如,電腦的製造廠商,它懂得怎樣裝好一部電腦和誰的零部件做的好,這個電腦廠商不必知道每個零部件的製作細節,但是,一樣可以製造出來性能優越(算是一種取最優吧)的電腦。

一、工廠模式

工廠模式主要是為創建對象提供過渡介面,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。

二、工廠模式分為三類

1.簡單工廠模式(Simple Factory)

2.工廠方法模式(Factory Method)

3.抽象工廠模式(Abstract Factory) 

這三種模式從上到下逐步抽象,並且更具一般性。

工廠方法模式:

一個抽象產品類,可以派生出多個具體產品類;  一個抽象工廠類,可以派生出多個具體工廠類;每個具體工廠類只能創建一個具體產品類的實例。

抽象工廠模式:

多個抽象產品類,每個抽象產品類可以派生出多個具體產品類;一個抽象工廠類,可以派生出多個具體工廠類;每個具體工廠類可以創建多個具體產品類的實例。  

三、簡單工廠模式 
建立一個工廠(一個函數或一個類方法)來製造新的對象。

代碼實例:

 1 public class Dog {
 2     private String name;
 3     private String address;
 4 
 5     void shout() {
 6         System.out.println("汪汪汪~~");
 7     }
 8 
 9     public String getName() {
10         return name;
11     }
12 
13     public void setName(String name) {
14         this.name = name;
15     }
16 
17     public String getAddress() {
18         return address;
19     }
20 
21     public void setAddress(String address) {
22         this.address = address;
23     }
24 }
25 
26 class DogFactory {
27     static public Dog getDog() {
28         // return new Dog();
29         Dog dog = new Dog();
30         dog.setAddress("浙江杭州");
31         dog.setName("M.zhou");
32         return dog;
33     }
34 }
35 
36 class Test2 {
37     public static void main(String[] args) {
38         Dog dog = DogFactory.getDog();
39         Dog dog2 = DogFactory.getDog();
40         Dog dog3 = DogFactory.getDog();
41 
42         System.out.println(dog == dog2); // false
43     }
44 }

四、工廠方法模式

工廠方法模式去掉了簡單工廠模式中工廠方法的靜態屬性,使得它可以被子類繼承。這樣在簡單工廠模式里集中在工廠方法上的壓力可以由工廠方法模式里不同的工廠子類來分擔。

工廠方法模式組成:

1.抽象工廠角色:

工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。在java中它由抽象類或者介面來實現。

2.具體工廠角色:

它含有和具體業務邏輯有關的代碼。由應用程式調用以創建對應的具體產品的對象。

3.抽象產品角色:

它是具體產品繼承的父類或者是實現的介面。在java中一般有抽象類或者介面來實現。

4.具體產品角色:

具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。

工廠方法模式使用繼承自抽象工廠角色的多個子類來代替簡單工廠模式中的“上帝類”。這樣便分擔了對象承受的壓力;而且這樣使得結構變得靈活 起來,前面學習過面向對象的三大特性,繼承、封裝和多態,工廠模式是將這三大特性集合起來的應用,同時工廠角色的結構也是符合開閉原則的。

下麵舉個例子:

/*
 * @author M.zhou
 * @date 2017-7-1 下午 18:59
 * version 1.0
 * 
 */

//創建電腦製造工廠
public interface MyFactory {
    public MyBattery createBattery(); // 定義創建電池

    public MyDisplay createDisplay(); // 定義創建顯示器

    public MyMotherBoard createMotherBorad(); // 定義創建主板

    public MyShell createShell(); // 定義創建外殼
}
//創建電腦原材料工廠,負責提供電池、顯示屏、主板和外殼
public class ComFactory implements MyFactory {

    @Override
    public <MyBattery> MyBattery createBattery() {
        // TODO Auto-generated method stub
        return new SuperBattery;
    }

    @Override
    public MyDisplay createDisplay() {
        // TODO Auto-generated method stub
        return new SuperDisplay;
    }

    @Override
    public MyMotherBoard createMotherBorad() {
        // TODO Auto-generated method stub
        return  new SuperMotherBoard;
    }

    @Override
    public MyShell createShell() {
        // TODO Auto-generated method stub
        return new SuperShell;
    }
}
//創建電腦裝配廠的介面,只負責從原材料那裡獲取材料並配置成新型電腦。其他的它一概不管
public interface ComAssemblyPlant {
    public Computer Assembley();
    
}
//新型電腦裝配廠(可以根據市場需求,更換、升級零件,製造新型電腦)
public class NewComputerFactory implements ComAssemblyPlant {
    MyFactory materialFactory; // 原料工廠

    @Override
    
    public Computer Assembley() {
        Computer computer=new Computer();
        
        computer.setBattery(materialFactory.createBattery());
        computer.setDisplay(materialFactory.createDisplay());
        computer.setMotherBoard(materialFactory.createMotherBorad());
        computer.setShell(materialFactory.createShell());
        return computer;
        
        }
    
    }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 索引 簡述 準備 示例 效果圖 結語 簡述 我在使用opencv2或3的時候想要在圖片上添加中文文字,需要去下載Freetype庫,編譯好鏈接到opencv庫中才能中文的輸出。網上大部分在圖片中插入中文的教程還是win+vs的配置教程。像我這種win下有環境,linux下有環境的人來說,想要同步代碼 ...
  • 1.1 庫的概念 在我看來,庫是已經寫好的、成熟的、可復用的代碼。每個程式都需要依賴很多底層庫,不可能每個人的代碼從零開始編寫代碼,因此庫的存在具有非常重要的意義。 在我們的開發的應用中經常有一些公共代碼是需要反覆使用的,就把這些代碼編譯為庫文件。 庫可以簡單看成一組目標文件的集合,將這些目標文件經 ...
  • 在Java中,面向對象編程有三大特性:封裝、繼承、多態。 先來說說封裝。 封裝,顧名思義,就是通過抽象數據類型(即ADT,一種為了將數據類型和可能在該數據類型上進行操作而定義的)將數據以及基於數據的操作封裝在一起,使之成為獨立的“實體”。 首先先來看一個Person類: 對於封裝的思想,我們需要盡可 ...
  • wxPython是一套基於Python的GUI,可用Python製作圖形化界面程式。 本文內容為根據電子書“wxPython實戰(中文版)高清.pdf”整理,若有錯,歡迎指正。 註:雖然控制項可以使用pos參數指定位置,但推薦使用Sizer佈局控制項對應用程式整體進行佈局,佈局控制項的詳細方法可以參考電子 ...
  • 前 言 php easyui框架--本篇學習主要是 easyui中的datagrid(數據表格)框架。 本篇學習主要通過講解一段代碼加GIF圖片學習datagrid(數據表格)中的一些常用屬性,還有與之相關的dialog(對話窗)和texbobox(文本框)的一些常用屬性,希望對讀者有幫助。 本篇主 ...
  • 操作系統: CentOS 6.9_x64 python語言版本: 2.7.13 問題描述 現有一個tcp客戶端程式,需定期從伺服器取數據,但由於種種原因(網路不穩定等)需要自動重連。 測試伺服器示例代碼: https://github.com/mike-zhang/pyExamples/blob/m ...
  • JAVA面向對象三大特性詳解 一、封裝 1、概念: 將類的某些信息隱藏在類內部,不允許外部程式直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。 2、好處: 只能通過規定的方法訪問數據。 隱藏類的實例細節,方便修改和實現。 3、封裝的實現步驟 需要註意:對封裝的屬性不一定要通過get/s ...
  • 題目描述 任何大於 1 的自然數 n 都可以寫成若幹個大於等於 2 且小於等於 n 的質數之和表達式(包括只有一個數構成的和表達式的情況),並且可能有不止一種質數和的形式。例如,9 的質數和表達式就有四種本質不同的形式: 9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...