Java面向?qū)ο笾畣卫O(shè)計模式詳解
一、什么是設(shè)計模式
1.靜態(tài)方法和屬性的經(jīng)典使用
2.設(shè)計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風格、以及解決問題的思考方式。設(shè)計模式就像是經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜,免去我們自己再思考和摸索。
二、什么是單例模式(單個的實例)
1.所謂類的單例設(shè)計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法
2.單例模式有兩種:①餓漢式 ②懶漢式
步驟:
1.構(gòu)造器私有化
2.類的內(nèi)部創(chuàng)建對象
3.向外暴露一個靜態(tài)的公共方法
三、餓漢式和懶漢式區(qū)別
1.兩者最主要的區(qū)別在于創(chuàng)建對象的時機不同,餓漢式是在類加載時就創(chuàng)建了對象實例,而懶漢式是在使用時才會創(chuàng)建
2.餓漢式不存在線程安全問題,而懶漢式存在線程安全問題(后面學(xué)習線程會補充)
3.餓漢式存在浪費資源的可能。如果一個程序員一個對象實例都沒有去使用,那么餓漢式創(chuàng)建的對象實例就浪費了;懶漢式是使用時才會創(chuàng)建,所以不存在這個問題
4.在javaSE標準類中, java.lang.Runtime就是經(jīng)典的單例模式
餓漢式案例
package com.learn.single_; import java.util.GregorianCalendar; /** * 演示餓漢式的單例模式 */ public class SingleTon01 { public static void main(String[] args) { //GirlFriend xh = new GirlFriend("小紅"); //GirlFriend xb = new GirlFriend("小白"); //通過方法可以獲取對象 GirlFriend instance1 = GirlFriend.getInstance(); System.out.println(instance1); GirlFriend instance2 = GirlFriend.getInstance(); System.out.println(instance2); System.out.println(instance1 == instance2);//同一個對象 } } //有一個類,GirlFriend //只能有一個女朋友 class GirlFriend { private String name; //為了能夠在靜態(tài)方法中返回gf對象,需要將其修飾為static private static GirlFriend gf = new GirlFriend("小紅紅"); //如何保障我們只能創(chuàng)建一個GirlFriend對象 //步驟[單例模式—餓漢式] //1.將構(gòu)造器私有化(防止在類的外部直接創(chuàng)建對象) //2.在類的內(nèi)部直接創(chuàng)建對象(該對象是static) //3.為了使用,提供一個公共的static方法,返回gf對象 private GirlFriend(String name) { this.name = name; } public static GirlFriend getInstance(){ return gf; } @Override public String toString() { return "GirlFriend{" + "name='" + name + '\'' + '}'; } }
懶漢式案例
package com.learn.single_; /** * 演示懶漢式的單例模式 */ public class SingleTon02 { public static void main(String[] args) { //new Cat("大黃"); //調(diào)用一個靜態(tài)屬性會讓類加載,但是靜態(tài)變量屬性并沒有創(chuàng)建對象,所以并不會調(diào)用構(gòu)造器 System.out.println(Cat.n1); Cat instance1 = Cat.getInstance(); System.out.println(instance1); //第二次去調(diào)getInstance時cat已經(jīng)不為空,不會再創(chuàng)建新的對象,會把上一次創(chuàng)建的對象返回 Cat instance2 = Cat.getInstance(); System.out.println(instance2); System.out.println(instance1 == instance2); //T } } //希望在程序運行中,只能創(chuàng)建一個cat對象 //使用單例模式 class Cat{ private String name; public static int n1 = 999; public static Cat cat; //默認為null //步驟 //1.仍然將構(gòu)造器私有化 //2.定義一個static靜態(tài)變量屬性 //3.提供一個public的static方法,可以返回一個cat對象 //4.懶漢式,只有當用戶使用getInstance時才返回一個cat對象,后面再次調(diào)用時會返回上一次創(chuàng)建的cat對象 // 從而保證單例 private Cat(String name) { System.out.println("構(gòu)造器被調(diào)用..."); this.name = name; } public static Cat getInstance(){ if(cat == null){ //如果還沒有創(chuàng)建cat對象 cat = new Cat("小可"); } return cat; } @Override public String toString() { return "Cat{" + "name='" + name + '\'' + '}'; } }
到此這篇關(guān)于Java面向?qū)ο笾畣卫O(shè)計模式詳解的文章就介紹到這了,更多相關(guān)Java單例設(shè)計模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
九個動畫組圖輪播總結(jié)全棧數(shù)據(jù)結(jié)構(gòu)數(shù)組鏈表
數(shù)據(jù)結(jié)構(gòu)和算法是密不可分的,兩者往往是相輔相成的存在,所以在學(xué)習數(shù)據(jù)結(jié)構(gòu)過程中,不免會遇到各種算法,數(shù)據(jù)結(jié)構(gòu)常用操作一般為:增刪改查。基本上所有的數(shù)據(jù)結(jié)構(gòu)都是圍繞這幾個操作進行展開,本文用九張動圖來闡述先進后出的數(shù)據(jù)結(jié)構(gòu)2021-08-08Ribbon單獨使用,配置自動重試,實現(xiàn)負載均衡和高可用方式
這篇文章主要介紹了Ribbon單獨使用,配置自動重試,實現(xiàn)負載均衡和高可用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12關(guān)于maven使用過程中無法導(dǎo)入依賴的一些總結(jié)
這篇文章主要介紹了關(guān)于maven使用過程中無法導(dǎo)入依賴的一些總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08mybatis多層嵌套resultMap及返回自定義參數(shù)詳解
這篇文章主要介紹了mybatis多層嵌套resultMap及返回自定義參數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12