Java基礎十 - 設計模式

一、單例

1. 創建

  • 餓漢式
package basic;public class ESingleton {// 先私有化靜態實例private static ESingleton eSingleton = new ESingleton();// 私有化構造方法,防止外部實例化private ESingleton(){};// 提供全局訪問方法public static ESingleton geteSingleton(){return eSingleton;}}
  • 懶漢式
package basic;public class LazySingleton {// 創建私有靜態實例,nullprivate static LazySingleton lazySingleton = null;// 私有構造方法,防止外部實例化private LazySingleton(){};// 提供全局訪問點,使用同步方法解決線程安全問題public static synchronized LazySingleton getLazySingleton(){if (lazySingleton == null){lazySingleton = new LazySingleton();}return lazySingleton;}
}

2. 區別

1. 餓漢式是在實例化私有靜態類加載時就創建,不管是否需要用;
2. 懶漢式是在實例加載時聲明但是木有創建,只有外部調用get需要用的時候才會創建需要注意線程安全

二、觀察者模式

1. 創建及概念

  • 概念
1. 觀察者模式是1對多,其中1發生變化后會自動通知,也能感知到變化
2. 例如:假設有三個人,小美(女,22),小王和小李。小美很漂亮,小王和小李是兩個程序猿,時刻關注著小美的一舉一動。有一天,小美說了一句:“誰來陪我打游戲啊。”這句話被小王和小李聽到了,結果樂壞了,蹭蹭蹭,沒一會兒,小王就沖到小美家門口了,在這里,小美是被觀察者,小王和小李是觀察者,被觀察者發出一條信息,然后觀察者們進行相應的處理
  • 創建
    • 寫一個接口用于獲取消息
package basic.pattern;public interface Person {// 用于獲取消息void getMessage(String s);
}
  • ?聲明3個人的類
package basic.pattern;public class Li implements Person {private static String name = "Xiao Li";public Li(){};@Overridepublic void getMessage(String s) {System.out.println(name + "收到消息" + s);}
}

??

package basic.pattern;public class Wang implements Person{private static String name = "Xiao Wang";public Wang(){};@Overridepublic void getMessage(String s){System.out.println(name + "收到消息: " + s);}
}
package basic.pattern;import java.util.ArrayList;
import java.util.List;public class Mei {List<Person> list = new ArrayList<Person>();public Mei(){};public void addPerson(Person person){list.add(person);}//遍歷list,把自己的通知發送給所有暗戀自己的人public void notifyPerson(){for (Person person:list){//主要這一步,調用對應人的getMessage方法,達到通知的目的person.getMessage("Come here!");}}}
  • 測試
package basic.pattern;public class TestObserverPattern {public static void main(String[] args) {Mei mei = new Mei(); //執行這個的時候已經執行了List<Person> list = new ArrayList<Person>();Li li = new Li();Wang wang = new Wang();mei.addPerson(li);mei.addPerson(wang);mei.notifyPerson();}
}

輸出:

Xiao Li收到消息Come here!
Xiao Wang收到消息: Come here!

三、適配器模式

1. 概念

將兩種完全不同的事物聯系到一起,就像現實生活中的變壓器。假設一個手機充電器需要的電壓是20V,但是正常的電壓是220V,這時候就需要一個變壓器,將220V的電壓轉換成20V的電壓,這樣,變壓器就將20V的電壓和手機聯系起來了。

2. 創建

package basic.pattern;public class AdapterTest {public static void main(String[] args) {System.out.println();Phone phone = new Phone();VoltageAdapter adapter = new VoltageAdapter();phone.setAdapter(adapter);phone.charge();}// 手機類static class Phone {public static final int V = 220; // 原始常量private VoltageAdapter adapter;// 充電public void charge() {adapter.changeVoltage();}public void setAdapter(VoltageAdapter adapter) {this.adapter = adapter;}}// 變壓器類static class VoltageAdapter {public void changeVoltage() {System.out.println("正在充電");System.out.println("原始電壓是:" + Phone.V + "V");System.out.println("變壓后電壓是:" + (Phone.V - 200) + "V");}}
}

說明:

1. Phone(手機類):這個類表示手機。在充電時,手機需要一個適配器來轉換電壓。
V 是手機需要的電壓,初始值為 220V。
charge() 方法是手機充電的方法,調用適配器的方法來改變電壓。2.VoltageAdapter(變壓器類):這個類表示電壓適配器,用于將原始電壓轉換成適合手機的電壓。
changeVoltage() 方法改變電壓,輸出充電信息,原始電壓和轉換后電壓。3. AdapterTest(適配器測試類):main 方法創建了一個手機和一個電壓適配器的實例。
phone.setAdapter(adapter) 將適配器設置給手機。
phone.charge() 調用手機的充電方法,實際上會調用適配器的電壓轉換方法。

四、工廠模式

1. 簡介

工廠模式(Factory Pattern)是一種創建型設計模式,它提供了一種創建對象的方式,
將對象的創建與使用分離。工廠模式通過使用一個共同的接口來創建不同類型的對象,
使得客戶端代碼不需要直接依賴于具體類的實例化。

說白了就是把創建對象和使用分離,降低耦合

封裝了對象的創建過程,客戶端只需要調用工廠方法,而不需要關心對象的具體創建細節。
降低了客戶端和具體類之間的耦合,使得代碼更加靈活和可維護。

2. 上代碼

創建Car的接口,實名有哪些方法

package basic.pattern;public interface Car {public void run();public void stop();
}
package basic.pattern;class Benz implements Car{@Overridepublic void run() {System.out.println("Benz is running");}@Overridepublic void stop() {System.out.println("Benz is stopping");}
}class Ford implements Car{@Overridepublic void run() {System.out.println("Ford is running");}@Overridepublic void stop() {System.out.println("Ford is stopping");}
}class Factory{public static Car getCarInstance(String carType){Car c = null;if (carType.equals("Benz")){c = new Benz();}if (carType.equals("Ford")){c = new Ford();}return c;}
}class Test{public static void main(String[] args) {Car c = Factory.getCarInstance("Benz");if(c != null){c.run();c.stop();}else {System.out.println("造不了這種汽車。。。");}}}

未完待續~~~~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36000.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)

時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價) 目錄 時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)預測結果基本介紹程序設計參考資料 預測結果 基本介紹 Matlab實現LSTM長短期記憶神經…

識別和應對內存抖動

關于作者&#xff1a;CSDN內容合伙人、技術專家&#xff0c; 從零開始做日活千萬級APP。 專注于分享各領域原創系列文章 &#xff0c;擅長java后端、移動開發、人工智能等&#xff0c;希望大家多多支持。 目錄 一、導讀二、概覽三、案例分析3.1 使用memory-profiler3.2 使用 cp…

磁粉制動器離合器收放卷應用介紹

張力控制系統的開環閉環應用介紹,請查看下面文章鏈接: PLC張力控制(開環閉環算法分析)_張力控制plc程序實例_RXXW_Dor的博客-CSDN博客里工業控制張力控制無處不在,也衍生出很多張力控制專用控制器,磁粉制動器等,本篇博客主要討論PLC的張力控制相關應用和算法,關于繞線…

什么是 fullgc

GC GC 全稱為garbage collection,中文含義為垃圾回收&#xff0c;在jvm中的含義為回收無用內存空間 Young space 中文名為年輕代或者新生代&#xff0c;為JVM 堆的一部分&#xff0c;由分代GC概念劃分而來&#xff0c;保存生命周期較短的對象 Tenured space 中文名為老年代…

APP外包開發的iOS開發語言

學習iOS開發需要掌握Swift編程語言和相關的開發工具、框架和技術。而學習iOS開發需要時間和耐心&#xff0c;尤其是對于初學者。通過堅持不懈的努力&#xff0c;您可以逐步掌握iOS開發技能&#xff0c;構建出功能豐富、優質的移動應用。今天和大家分享學習iOS開發的一些建議方法…

【數據結構系列】鏈表

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續學…

解決hbase節點已下線,但在status中顯示為dead問題

工作中需要下線4臺hbase小節點&#xff0c;下線完成后使用status 命令查看,有一臺為dead狀態: 使用status detailed 查看&#xff0c;發現“hd-03"這臺節點是dead。 檢查各節點配置文件無誤&#xff0c;并使用 /opt/hbase/bin/hbase-daemon.sh restart master 重啟兩個…

less基本使用

1 less中的變量 //對值進行聲明 link-color: #ccc//定義變量名稱 .{sleName} {}bg: background-color; //定義屬性名稱 .container {{bg}: red; }2 繼承&#xff08;復用重復樣式&#xff09; //繼承必須位于選擇器最后 //繼承選擇器名不能為變量 .a:hover:extend(.b) {}.a {…

走出迷宮(多組輸入bfs)

鏈接&#xff1a;登錄—專業IT筆試面試備考平臺_牛客網 來源&#xff1a;牛客網 題目描述 小明現在在玩一個游戲&#xff0c;游戲來到了教學關卡&#xff0c;迷宮是一個N*M的矩陣。 小明的起點在地圖中用“S”來表示&#xff0c;終點用“E”來表示&#xff0c;障礙物用“#…

淺談人工智能技術與物聯網結合帶來的好處

物聯網是指通過互聯網和各種技術將設備進行連接&#xff0c;實時采集數據、交互信息的網絡&#xff0c;對設備實現智能化自動化感知、識別和控制&#xff0c;給人們帶來便利。 人工智能是計算機科學的一個分支&#xff0c;旨在研究和開發能夠模擬人類智能的技術和方法。人工智能…

Redis: 詳解、使用教程和示例

Redis: 詳解、使用教程和示例 什么是 Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、內存數據存儲系統&#xff0c;它可以用作數據庫、緩存和消息中間件。它支持多種數據結構&#xff0c;如字符串、哈希表、列表、集合、有序集合等…

Hadoop組件

前言 Hadoop 是一個能夠對大量數據進行分布式處理的軟件框架。具有可靠、高效、可伸縮的特點。 HDFS&#xff08;hadoop分布式文件系統&#xff09; 是hadoop體系中數據存儲管理的基礎。他是一個高度容錯的系統&#xff0c;能檢測和應對硬件故障。

后院失火、持續虧損!Mobileye半年報「不回避」競爭壓力

"客戶在2023年上半年非常謹慎&#xff0c;導致增長率低于正常水平&#xff0c;但我們已經看到下半年回暖趨勢&#xff0c;預計下半年交付將比去年同期增長16%&#xff0c;遠高于上半年。"這是Mobileye在近日公司半年報發布會上的預判。 公開數據顯示&#xff0c;今年…

Python 實現Selenium錄屏的一種方法(圖片整合成動態圖)

由于UI層自動化的不穩定性&#xff0c;經常會遇到執行中斷或用例失敗的問題&#xff0c;以下是一些常見的措施。 1.詳細的日志 2.定位出錯時截圖 3.Pytest的緩存機制(可以記錄成功了哪些失敗了哪些) 4.自動重試機制(如pytest-rerunfailures) 5.用例錄像 用例錄像是最直觀的一…

2023網絡安全常用工具匯總(附學習資料+工具安裝包)

幾十年來&#xff0c;攻擊方、白帽和安全從業者的工具不斷演進&#xff0c;成為網絡安全長河中最具技術特色的燈塔&#xff0c;并在一定程度上左右著網絡安全產業發展和演進的方向&#xff0c;成為不可或缺的關鍵要素之一。 話不多說&#xff0c;網絡安全10款常用工具如下 1、…

Opencv4基于C++基礎入門筆記:圖像 顏色 事件響應 圖形 視頻 直方圖

效果圖??????&#xff1a;opencv人臉識別效果圖(請叫我真愛粉) 先看一下效果圖勾起你的興趣&#xff01; 文章目錄&#xff1a; 一&#xff1a;環境配置搭建 二&#xff1a;圖像 1.圖像讀取與顯示 main.cpp 運行結果 2.圖像色彩空間轉換 2.1 換色彩 test.h …

感受RFID服裝門店系統的魅力

嘿&#xff0c;親愛的時尚追隨者們&#xff01;今天小編要給你們帶來一股時尚新風潮&#xff0c;讓你們感受一下什么叫做“RFID服裝門店系統”&#xff0c;這個超酷的東西&#xff01; 別著急&#xff0c;先別翻白眼&#xff0c;小編來解釋一下RFID是什么玩意兒。它是射頻識別…

云計算——存儲虛擬化功能

作者簡介&#xff1a;一名云計算網絡運維人員、每天分享網絡與運維的技術與干貨。 座右銘&#xff1a;低頭趕路&#xff0c;敬事如儀 個人主頁&#xff1a;網絡豆的主頁????? 目錄 前期回顧 前言 一.存儲虛擬化功能 1.精簡磁盤和空間回收 2.快照 &#xff08;1&a…

面試熱題(反轉字符串中的單詞)

給你一個字符串 s &#xff0c;請你反轉字符串中 單詞 的順序。 單詞 是由非空格字符組成的字符串。s 中使用至少一個空格將字符串中的 單詞 分隔開。 返回 單詞 順序顛倒且 單詞 之間用單個空格連接的結果字符串。 注意&#xff1a;輸入字符串 s中可能會存在前導空格、尾隨空格…

JVM——棧和堆概述,以及有什么區別?

方法棧 方法棧并不是某一個 JVM 的內存空間&#xff0c;而是我們描述方法被調用過程的一個邏輯概念。 在同一個線程內&#xff0c;T1()調用T2()&#xff1a; T1()先開始&#xff0c;T2()后開始&#xff1b;T2()先結束&#xff0c;T1()后結束。 堆和棧概述 從英文單詞角度來…