国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

自學(xué)設(shè)計模式(類圖、設(shè)計原則、單例模式 - 餓漢/懶漢)

這篇具有很好參考價值的文章主要介紹了自學(xué)設(shè)計模式(類圖、設(shè)計原則、單例模式 - 餓漢/懶漢)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

設(shè)計模式需要用到面向?qū)ο蟮娜筇匦浴庋b、繼承、多態(tài)(同名函數(shù)具有不同的狀態(tài))

UML類圖 eg.—— 描述類之間的關(guān)系(設(shè)計程序之間畫類圖)

自學(xué)設(shè)計模式(類圖、設(shè)計原則、單例模式 - 餓漢/懶漢),設(shè)計模式

?+: public; #: protected; -: private; 下劃線: static

屬性名:類型(=默認值)

方法和變量分開-------

虛函數(shù)斜體,純虛函數(shù)在虛函數(shù)類型后=0,并且類名斜體

類與類之間的關(guān)系:

1. 繼承關(guān)系(空心三角形實線,箭頭指父類)

2. 關(guān)聯(lián)關(guān)系(單項關(guān)聯(lián)、雙向關(guān)聯(lián)、自關(guān)聯(lián) - 鏈表)用帶箭頭和不帶箭頭的實現(xiàn)

3. 聚合關(guān)系(整體與部分的關(guān)系,整體析構(gòu)部分不析構(gòu))空心菱形實線鏈接,指向整體

4. 組合關(guān)系(整體析構(gòu)部分析構(gòu))實心菱形實線鏈接

5. 依賴關(guān)系(使用關(guān)系)帶箭頭的虛線,指向被依賴方

類之間的關(guān)系強弱:繼承(泛化)>組合>聚合>關(guān)聯(lián)>依賴(類圖按類間最強關(guān)系就可)

設(shè)計模式三原則

單一職責(zé)原則(面向?qū)ο螅?/strong>

使得類的功能盡量單一,方便管理維護,避免類的臃腫。

開放封閉原則:

對于擴展是開放的,對于修改是封閉的,增加程序可維護性可擴展性。

依賴轉(zhuǎn)換原則:

高層模塊不應(yīng)該依賴低層模塊(應(yīng)用程序不直接調(diào)用API),兩個都應(yīng)該依賴抽象。

抽象不依賴細節(jié),細節(jié)應(yīng)該依賴抽象。(里氏代換原則)

單例模式和任務(wù)隊列(類的對象只能創(chuàng)建出一個)

一個項目中,全局范圍內(nèi),某個類的實例有且僅有一個,通過這個實例向其他模塊提供數(shù)據(jù)的全局訪問。(簡介訪問實現(xiàn)對于變量的保護)

將類的默認構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)設(shè)為private,或者將兩個函數(shù)=delete;

使類無法在外面創(chuàng)建對象,只能通過類名訪問靜態(tài)屬性或者方法;

懶漢模式和餓漢模式

餓漢模式——定義類的時候創(chuàng)建單例對象(多線程下沒有線程安全問題)

// 餓漢模式
#include <bits/stdc++.h>
using namespace std;

class A{
public:
	A(const A& a) = delete;
	A& operator =(const A& a) = delete;
	static A* get(){
		return num;
	}
	print(){
		cout<<"單例模式的唯一實例";
	}
private:
	A() = default; // 默認構(gòu)造 
	static A* num;
};

A* A::num = new A;

int main(){
	A* a = A::get();
	a->print(); 
	return 0;
} 

懶漢模式——什么時候使用單例對象再去創(chuàng)建實例(多線程下存在線程安全問題)

// 懶漢模式
#include <bits/stdc++.h>
using namespace std;

class A{
public:
	A(const A& a) = delete;
	A& operator =(const A& a) = delete;
	static A* get(){
        num = new A;
		return num;
	}
	print(){
		cout<<"單例模式的唯一實例";
	}
private:
	A() = default; // 默認構(gòu)造 
	static A* num;
};

A* A::num = nullptr;

int main(){
	A* a = A::get();
	a->print(); 
	return 0;
} 

懶漢模式的線程安全問題

可以通過雙重檢查鎖定解決懶漢模式的線程安全問題:1. 互斥鎖(導(dǎo)致效率低) 2. 實例創(chuàng)建判定

// 懶漢模式
#include <bits/stdc++.h> 
using namespace std;

class A{
public:
	A(const A& a) = delete;
	A& operator =(const A& a) = delete;
	static A* get(){ // first check
		if(num==nullptr){
			lk.lock();
			if(num==nullptr)num = new A; // second check 
			lk.unlock();
		}
		return num;
	}
	print(){
		cout<<"單例模式的唯一實例";
	}
private:
	A() = default; // 默認構(gòu)造 
	static A* num;
	static mutex lk;
};

A* A::num = nullptr;
mutex A::lk;

int main(){
	A* a = A::get();
	a->print(); 
	return 0;
} 

通過原子變量(atomic - 底層控制機器指令執(zhí)行順序)解決雙重檢查鎖定的問題;放置底層的機器指令不按理想順序執(zhí)行

// 懶漢模式
#include <bits/stdc++.h> 
using namespace std;

class A{
public:
	A(const A& a) = delete;
	A& operator =(const A& a) = delete;
	static A* get(){ // first check
		A* cur = task.load();
		if(cur==nullptr){
			lk.lock();
			cur = task.load();
			if(cur==nullptr){
				cur = new A; // second check
				task.store(cur);
			} 
			lk.unlock();
		}
		return cur;
	}
	print(){
		cout<<"單例模式的唯一實例";
	}
private:
	A() = default; // 默認構(gòu)造 
	static A* num;
	static mutex lk;
	static atomic<A*> task;
};

A* A::num = nullptr;
mutex A::lk;
atomic<A*> A::task;

int main(){
	A* a = A::get();
	a->print(); 
	return 0;
} 

使用靜態(tài)局部對象解決線程安全問題

#include <bits/stdc++.h> 
using namespace std;

class A{
public:
	A(const A& a) = delete;
	A& operator =(const A& a) = delete;
	static A* get(){ // first check
		static A a;
		return &a; 
	}
	print(){
		cout<<"單例模式的唯一實例";
	}
private:
	A() = default; // 默認構(gòu)造 
};

int main(){
	A* a = A::get();
	a->print(); 
	return 0;
} 

并發(fā)執(zhí)行應(yīng)當(dāng)?shù)却兞客瓿沙跏蓟?/p>

總結(jié)

1. 餓漢模式不存在線程安全問題

2. 懶漢模式通過雙重檢查鎖定+原子變量或者靜態(tài)局部對象(簡單)可以解決線程安全問題? ? ? ?文章來源地址http://www.zghlxwxcb.cn/news/detail-678150.html

實踐(多線程模式下的任務(wù)模型)

#include <bits/stdc++.h>
using namespace std;


// 餓漢模式
#include <bits/stdc++.h>
using namespace std;

class A{
public:
	A(const A& a) = delete;
	A& operator =(const A& a) = delete;
	static A* get(){
		return num;
	}
	print(){
		cout<<"單例模式的唯一實例";
	}
	
	bool isempty(){
		lock_guard<mutex> locker(m_mutex);
		return mis.empty(); 
	}
	
	void add_m(int node){
		lock_guard<mutex> locker(m_mutex);
		mis.push(node);
	}
	
	bool minus_m(){
		lock_guard<mutex> locker(m_mutex);
		if(mis.empty())return false;
		else{
			mis.pop();
		}
		return true;
	}
	
	int get_m(){
		lock_guard<mutex> locker(m_mutex);
		if(mis.empty())return -1;
		return mis.front();	
	}
private:
	A() = default; // 默認構(gòu)造 
	static A* num;
	queue<int> mis;
	mutex m_mutex;
};

A* A::num = new A;

int main(){
	A *a = A::get();
	
	// 生產(chǎn)者
	thread t1([=](){
		for(int i = 0 ; i<10 ; i++){
			a->add_m(i+100);
			cout<<"push data: "<<i+100<<" "<<"threadId: "<<this_thread::get_id()<<endl;
			this_thread::sleep_for(chrono::milliseconds(500));
		} 
	});

	// 消費者 
	thread t2([=](){
		this_thread::sleep_for(chrono::milliseconds(100));
		while(!a->isempty()){
			int cur = a->get_m();
			cout<<"take data: "<<cur<<" "<<"threadId: "<<this_thread::get_id()<<endl;
			a->minus_m();
			this_thread::sleep_for(chrono::milliseconds(1000));
		} 
	});
	
	// 阻塞主線程 
	t1.join();
	t2.join();
	
	return 0;
} 

到了這里,關(guān)于自學(xué)設(shè)計模式(類圖、設(shè)計原則、單例模式 - 餓漢/懶漢)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 設(shè)計模式——C++11實現(xiàn)單例模式(餓漢模式、懶漢模式),與單例的進程

    本文將介紹單例模式,使用C++11實現(xiàn)多個版本的單例模式,分析各自的優(yōu)缺點。最后提及如何實現(xiàn)一個單例的進程。 單例模式屬于創(chuàng)建型模式,提供了一種創(chuàng)建對象的方式。 單例模式確保一個類只有一個實例。通過一個類統(tǒng)一地訪問這個實例。 思想:將構(gòu)造函數(shù)設(shè)置為私有

    2024年02月09日
    瀏覽(22)
  • 設(shè)計模式第一課-單例模式(懶漢模式和餓漢模式)

    設(shè)計模式第一課-單例模式(懶漢模式和餓漢模式)

    個人理解:單例模式實際就是通過類加載的方式獲取到一個對象,并且保證這個對象在使用中只有一個,不允許再次被創(chuàng)建 1、懶漢模式的基礎(chǔ)寫法 代碼解釋: (1)、編寫LazySingleton類的時候,需要將成員屬性設(shè)定為static,這樣才會是類屬性 (2)、重寫構(gòu)造方法,將其設(shè)置

    2024年02月05日
    瀏覽(23)
  • 24種設(shè)計模式之單例模式(餓漢式、懶漢式)

    24種設(shè)計模式之單例模式(餓漢式、懶漢式)

    單例模式( Singleton Pattern )是指確保一個類在任何情況下都絕對只有一個實例,并提供一個全局訪問點。單例模式是創(chuàng)建型模式。單例模式在現(xiàn)實生活中應(yīng)用也非常廣泛,例如,總統(tǒng),班主任等。J2EE標準中的ServletContext 、ServletContextConfig 等、Spring框架應(yīng)用中的。 特點:構(gòu)造方

    2024年02月07日
    瀏覽(24)
  • Java中單例(單態(tài)、原子)設(shè)計模式(餓漢式/懶漢式)

    先看文章目錄,大致了解知識點結(jié)構(gòu),直接點擊文章目錄可以跳轉(zhuǎn)到文章指定位置。 設(shè)計模式就是設(shè)計出來的固定問題的解決方法,描述了在軟件設(shè)計過程中的一些不斷重復(fù)發(fā)生的問題和解決方案。遇到類似問題的時候可以直接使用現(xiàn)成的模式方案。 ①單例模式中一個類只

    2024年02月04日
    瀏覽(29)
  • Java設(shè)計模式之單例模式詳解(懶漢式和餓漢式)

    在開發(fā)工作中,有些類只需要存在一個實例,這時就可以使用單例模式。Java中的單例模式是一種常見的設(shè)計模式,它確保一個類只有一個實例,并提供全局訪問點。下面來介紹一下兩種常見的單例模式:懶漢式和餓漢式。 懶漢式屬于一種延遲加載的單例模式,它的特點是在

    2024年02月15日
    瀏覽(25)
  • 單例設(shè)計模式精講(餓漢式和懶漢式實現(xiàn)的重要方法)

    目錄 什么叫做單例模式? 餓漢式和懶漢式的區(qū)別? 餓漢式-方式1(靜態(tài)變量方式) 餓漢式-方式2(靜態(tài)代碼塊方式) 懶漢式-方式1(線程不安全) 懶漢式-方式2(線程安全) 懶漢式-方式3(雙重檢查鎖) 懶漢式-方式4(靜態(tài)內(nèi)部類方式) 什么叫做單例模式? ????????涉

    2024年02月12日
    瀏覽(15)
  • Java設(shè)計模式之創(chuàng)建型-單例模式(UML類圖+案例分析)

    Java設(shè)計模式之創(chuàng)建型-單例模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計 四、案例分析 4.1、餓漢模式 4.2、懶漢模式(線程不安全) 4.3、懶漢模式(線程安全) 4.4、雙重檢索模式 4.5、靜態(tài)內(nèi)部類 4.6、枚舉? 五、總結(jié) 單例模式確保一個類只有一個實例,提供一個全局訪問點。一般實現(xiàn)方式是把構(gòu)造函

    2024年02月13日
    瀏覽(46)
  • 【Java|多線程與高并發(fā)】設(shè)計模式-單例模式(餓漢式,懶漢式和靜態(tài)內(nèi)部類)

    【Java|多線程與高并發(fā)】設(shè)計模式-單例模式(餓漢式,懶漢式和靜態(tài)內(nèi)部類)

    設(shè)計模式是一種在軟件開發(fā)中常用的解決復(fù)雜問題的方法論。它提供了一套經(jīng)過驗證的解決方案,用于解決特定類型問題的設(shè)計和實現(xiàn)。設(shè)計模式可以幫助開發(fā)人員提高代碼的可重用性、可維護性和可擴展性。 設(shè)計模式有很多,本文主要介紹單例模式. 單例模式是一種創(chuàng)建型設(shè)

    2024年02月11日
    瀏覽(28)
  • 設(shè)計模式(1) - UML類圖

    設(shè)計模式(1) - UML類圖

    從這一節(jié)開始,我們將一起學(xué)習(xí)設(shè)計模式。我們的學(xué)習(xí)目標是什么呢? 了解常用設(shè)計模式以及它們的使用場景; 分析實際工程中設(shè)計模式的使用,揣摩實際意圖,了解作者設(shè)計思路; 嘗試運用設(shè)計模式迭代、重構(gòu)自己的代碼; 提升軟件架構(gòu)設(shè)計思路。 最近在閱讀 Android 源

    2024年02月09日
    瀏覽(21)
  • Java設(shè)計模式之UML類圖

    Java設(shè)計模式之UML類圖

    UML圖有很多種,但是并非必須掌握所有的UML圖,才能完整系統(tǒng)分析和設(shè)計工作。一般說來,在UML圖中,只要掌握類圖、用例圖、時序圖的使用,就能完成大部分的工作。對于程序員來說,最頻繁使用的莫過于類圖。因此,這里我只講解UML類圖。 類圖是面向?qū)ο笙到y(tǒng)建模中最常

    2024年02月03日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包