Java面向?qū)ο笾畣卫O(shè)計(jì)模式詳解
一、什么是設(shè)計(jì)模式
1.靜態(tài)方法和屬性的經(jīng)典使用
2.設(shè)計(jì)模式是在大量的實(shí)踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問(wèn)題的思考方式。設(shè)計(jì)模式就像是經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜,免去我們自己再思考和摸索。
二、什么是單例模式(單個(gè)的實(shí)例)
1.所謂類(lèi)的單例設(shè)計(jì)模式,就是采取一定的方法保證在整個(gè)的軟件系統(tǒng)中,對(duì)某個(gè)類(lèi)只能存在一個(gè)對(duì)象實(shí)例,并且該類(lèi)只提供一個(gè)取得其對(duì)象實(shí)例的方法
2.單例模式有兩種:①餓漢式 ②懶漢式
步驟:
1.構(gòu)造器私有化
2.類(lèi)的內(nèi)部創(chuàng)建對(duì)象
3.向外暴露一個(gè)靜態(tài)的公共方法
三、餓漢式和懶漢式區(qū)別
1.兩者最主要的區(qū)別在于創(chuàng)建對(duì)象的時(shí)機(jī)不同,餓漢式是在類(lèi)加載時(shí)就創(chuàng)建了對(duì)象實(shí)例,而懶漢式是在使用時(shí)才會(huì)創(chuàng)建
2.餓漢式不存在線程安全問(wèn)題,而懶漢式存在線程安全問(wèn)題(后面學(xué)習(xí)線程會(huì)補(bǔ)充)
3.餓漢式存在浪費(fèi)資源的可能。如果一個(gè)程序員一個(gè)對(duì)象實(shí)例都沒(méi)有去使用,那么餓漢式創(chuàng)建的對(duì)象實(shí)例就浪費(fèi)了;懶漢式是使用時(shí)才會(huì)創(chuàng)建,所以不存在這個(gè)問(wèn)題
4.在javaSE標(biāo)準(zhǔn)類(lèi)中, 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("小白");
//通過(guò)方法可以獲取對(duì)象
GirlFriend instance1 = GirlFriend.getInstance();
System.out.println(instance1);
GirlFriend instance2 = GirlFriend.getInstance();
System.out.println(instance2);
System.out.println(instance1 == instance2);//同一個(gè)對(duì)象
}
}
//有一個(gè)類(lèi),GirlFriend
//只能有一個(gè)女朋友
class GirlFriend {
private String name;
//為了能夠在靜態(tài)方法中返回gf對(duì)象,需要將其修飾為static
private static GirlFriend gf = new GirlFriend("小紅紅");
//如何保障我們只能創(chuàng)建一個(gè)GirlFriend對(duì)象
//步驟[單例模式—餓漢式]
//1.將構(gòu)造器私有化(防止在類(lèi)的外部直接創(chuàng)建對(duì)象)
//2.在類(lèi)的內(nèi)部直接創(chuàng)建對(duì)象(該對(duì)象是static)
//3.為了使用,提供一個(gè)公共的static方法,返回gf對(duì)象
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)用一個(gè)靜態(tài)屬性會(huì)讓類(lèi)加載,但是靜態(tài)變量屬性并沒(méi)有創(chuàng)建對(duì)象,所以并不會(huì)調(diào)用構(gòu)造器
System.out.println(Cat.n1);
Cat instance1 = Cat.getInstance();
System.out.println(instance1);
//第二次去調(diào)getInstance時(shí)cat已經(jīng)不為空,不會(huì)再創(chuàng)建新的對(duì)象,會(huì)把上一次創(chuàng)建的對(duì)象返回
Cat instance2 = Cat.getInstance();
System.out.println(instance2);
System.out.println(instance1 == instance2); //T
}
}
//希望在程序運(yùn)行中,只能創(chuàng)建一個(gè)cat對(duì)象
//使用單例模式
class Cat{
private String name;
public static int n1 = 999;
public static Cat cat; //默認(rèn)為null
//步驟
//1.仍然將構(gòu)造器私有化
//2.定義一個(gè)static靜態(tài)變量屬性
//3.提供一個(gè)public的static方法,可以返回一個(gè)cat對(duì)象
//4.懶漢式,只有當(dāng)用戶使用getInstance時(shí)才返回一個(gè)cat對(duì)象,后面再次調(diào)用時(shí)會(huì)返回上一次創(chuàng)建的cat對(duì)象
// 從而保證單例
private Cat(String name) {
System.out.println("構(gòu)造器被調(diào)用...");
this.name = name;
}
public static Cat getInstance(){
if(cat == null){ //如果還沒(méi)有創(chuàng)建cat對(duì)象
cat = new Cat("小可");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}到此這篇關(guān)于Java面向?qū)ο笾畣卫O(shè)計(jì)模式詳解的文章就介紹到這了,更多相關(guān)Java單例設(shè)計(jì)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中switch-case結(jié)構(gòu)的使用方法舉例詳解
這篇文章主要介紹了Java中switch-case結(jié)構(gòu)使用的相關(guān)資料,switch-case結(jié)構(gòu)是Java中處理多個(gè)分支條件的一種有效方式,它根據(jù)一個(gè)表達(dá)式的值來(lái)執(zhí)行不同的代碼塊,需要的朋友可以參考下2025-01-01
SpringAOP實(shí)現(xiàn)自定義接口權(quán)限控制
本文主要介紹了SpringAOP實(shí)現(xiàn)自定義接口權(quán)限控制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
SpringCloud添加客戶端Eureka Client過(guò)程解析
這篇文章主要介紹了SpringCloud添加客戶端Eureka Client過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
在Idea2020.1中使用gitee2020.1.0創(chuàng)建第一個(gè)代碼庫(kù)的實(shí)現(xiàn)
這篇文章主要介紹了在Idea2020.1中使用gitee2020.1.0創(chuàng)建第一個(gè)代碼庫(kù)的實(shí)現(xiàn),文中通過(guò)圖文示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
解決IDEA使用Spring Initializr創(chuàng)建項(xiàng)目時(shí)無(wú)法連接到https://start.spring.io的問(wèn)
這篇文章主要介紹了解決IDEA使用Spring Initializr創(chuàng)建項(xiàng)目時(shí)無(wú)法連接到https://start.spring.io的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
SpringCloud使用spring-boot-devtools 進(jìn)行熱部署的實(shí)現(xiàn)
本文主要介紹了Spring Cloud使用spring-boot-devtools進(jìn)行熱部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-10-10
SpringBoot整合MyBatis-Flex的保姆級(jí)教程
MyBatis-Flex 是一個(gè)基于 MyBatis 的增強(qiáng)框架,它提供了比傳統(tǒng) MyBatis Plus 更加強(qiáng)大和靈活的功能特性,下面我們就來(lái)看看如何在SpringBoot中整合MyBatis-Flex吧2026-01-01
java shiro實(shí)現(xiàn)退出登陸清空緩存
本篇文章主要介紹了java shiro實(shí)現(xiàn)退出登陸清空緩存,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
關(guān)于Java垃圾回收開(kāi)銷(xiāo)降低的幾條建議
垃圾回收(Garbage Collection)是Java虛擬機(jī)(JVM)垃圾回收器提供的一種用于在空閑時(shí)間不定時(shí)回收無(wú)任何對(duì)象引用的對(duì)象占據(jù)的內(nèi)存空間的一種機(jī)制,下面這篇文章主要介紹了關(guān)于Java垃圾回收開(kāi)銷(xiāo)降低的幾條建議,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02

