設計模式 之 抽象工廠模式

項目源碼:https://gitee.com/Jacob-gitee/DesignMode

個人博客 :https://jacob.org.cn

女媧的失誤

工廠模式中講了女媧造人的故事。人是造出來了,世界也熱鬧了,可是低頭一看,都是清一色的類型,缺少關愛、仇恨、喜怒哀樂等情緒,人類的生命太平淡了,女媧一想,猛然一拍腦袋,忘記給人類定義性別了,那怎么辦?抹掉重來,于是人類經過一次大洗禮,所有的人種都消滅掉了,世界又是空無一物,寂靜而又寂寞。

由于女媧之前的準備工作花費了非常大的精力,比如準備黃土、八卦爐等,從頭開始建立所有的事物也是不可能的,那就想在現有的條件下重新造人,盡可能舊物利用嘛。人種 (Product產品類)應該怎么改造呢?怎么才能讓人類有愛有恨呢?是神仙當然有辦法了,定義互斥的性別,然后在每個個體中埋下一顆種子:異性相吸,成熟后就一定會去找個異性(這就是我們說的愛情原動力)。從設計角度來看,一個具體的對象通過兩個坐標就可以確 定:膚色和性別。

image-20200819112407376

產品類分析完畢了,生產的工廠類(八卦爐)該怎么改造呢?只有一個生產設備,要么生產出來的全都是男性,要么都是女性。那不行呀,這么翻天覆地的改造就是為了產生不同 性別的人類。有辦法了!把目前已經有的生產設備——八卦爐拆開,于是女媧就使用了“八 卦復制術”,把原先的八卦爐一個變兩個,并且略加修改,就成了女性八卦爐(只生產女性 人種)和男性八卦爐(只生產男性人種),于是乎女媧就開始準備生產了,其類圖如圖9-2所示。

這個類圖雖然大,但是比較簡單。Java的典型類圖,一個接口,多個抽象類,然后是N個實現類,每個人種都是一個抽象類,性別是在各個實現類中實現的。特別需要說明的是 HumanFactory接口,在這個接口中定義了三個方法,分別用來生產三個不同膚色的人種,也就是我們在圖9-1中的Y坐標,它的兩個實現類分別是性別,也就是圖9-1中的X坐標,通過X 坐標(性別)和Y坐標(膚色)唯一確定了一個生產出來的對象。我們來看看相關的實現,Human接口。

image-20200819143500889

/*** @program: DesignMode* @description: 人種接口* @author: Jacob* @create: 2020-08-18 10:57**/
public interface Human {//每個人種都有相應的顏色public void getColor();//人類會說話public void talk();//每個人都有性別public void getSex();}

人種有三個抽象類,負責人種的抽象屬性定義:膚色和語言。白色人種、黑色人種、黃 色人種分別如代碼。

/*** @program: DesignMode* @description: 黑色人種* @author: Jacob* @create: 2020-08-18 11:14**/
public abstract class AbstractBlackHuman implements Human{//黑色人種的皮膚顏色是黑色的@Overridepublic void getColor() {System.out.println("黑色人種的皮膚顏色是黑色的!");}//黑色人種講話@Overridepublic void talk() {System.out.println("黑色人種會說話,一般人聽不懂。");}}
/*** @program: DesignMode* @description: 白色人種* @author: Jacob* @create: 2020-08-18 11:13**/
public abstract class AbstractWhiteHuman implements Human {//白色人種的皮膚顏色是白色的@Overridepublic void getColor() {System.out.println("白色人種的皮膚顏色是白色的!");}//白色人種講話@Overridepublic void talk() {System.out.println("白色人種會說話,一般說的都是單字節。");}}
/*** @program: DesignMode* @description: 黃色人種* @author: Jacob* @create: 2020-08-18 11:16**/
public abstract class AbstractYellowHuman implements Human {//黃色人種的皮膚顏色是黃色的@Overridepublic void getColor() {System.out.println("黃色人種的皮膚顏色是黃色的!");}//黃色人種講話@Overridepublic void talk() {System.out.println("黃色人種會說話,一般說的都是雙字節。");}}

每個抽象類都有兩個實現類,分別實現公共的最細節、最具體的事物:膚色和語言。具 體的實現類實現膚色、性別定義。

/*** @program: DesignMode* @description: 黑色女性人種* @author: Jacob* @create: 2020-08-18 11:21**/
public class FemaleBlackHuman extends AbstractBlackHuman {@Overridepublic void getSex() {System.out.println("黑色女性人種");}
}
/*** @program: DesignMode* @description: 黑色男性人種* @author: Jacob* @create: 2020-08-18 11:22**/
public class MaleBlackHuman extends AbstractBlackHuman{@Overridepublic void getSex() {System.out.println("黑色男性人種");}
}
/*** @program: DesignMode* @description: 白色女性人種* @author: Jacob* @create: 2020-08-18 11:20**/
public class FemaleWhiteHuman extends AbstractWhiteHuman{@Overridepublic void getSex() {System.out.println("白色女性人種");}
}
/*** @program: DesignMode* @description: 白色男性人種* @author: Jacob* @create: 2020-08-18 11:20**/
public class MaleWhiteHuman extends AbstractWhiteHuman{@Overridepublic void getSex() {System.out.println("白色男性人種");}
}
/*** @program: DesignMode* @description: 黃色女性人種* @author: Jacob* @create: 2020-08-18 11:17**/
public class FemaleYellowHuman extends AbstractYellowHuman {@Overridepublic void getSex() {System.out.println("黃色女性人種");}
}
/*** @program: DesignMode* @description: 黃色男性人種* @author: Jacob* @create: 2020-08-18 11:18**/
public class MaleYellowHuman extends AbstractYellowHuman {@Overridepublic void getSex() {System.out.println("黃色男性人種");}
}

到此為止,我們已經把真實世界的人種都定義出來了,剩下的工作就是怎么制造人類。

/*** @program: DesignMode* @description: 八卦爐定義* @author: Jacob* @create: 2020-08-18 17:47**/
public interface HumanFactory {//制造一個黃色人種public Human createYellowHuman();//制造一個白色人種public Human createWhiteHuman();//制造一個黑色人種public Human createBlackHuman();}

在接口中,我們看到八卦爐是可以生產出不同膚色人種的(當然了,女媧的失誤嘛), 那它有多少個八卦爐呢?兩個,分別生產女性和男性,女性和男性八卦爐。

/*** @program: DesignMode* @description: 生產女性的八卦爐* @author: Jacob* @create: 2020-08-18 17:48**/
public class FemaleFactory implements HumanFactory {//生產出黃人女性@Overridepublic Human createYellowHuman() {return new FemaleYellowHuman();}//生產出白人女性@Overridepublic Human createWhiteHuman() {return new FemaleWhiteHuman();}//生產出黑人女性@Overridepublic Human createBlackHuman() {return new FemaleBlackHuman();}
}
/*** @program: DesignMode* @description: 生產男性的八卦爐* @author: Jacob* @create: 2020-08-18 17:49**/
public class MaleFactory implements HumanFactory {//生產出黑人男性@Overridepublic Human createBlackHuman() {return new MaleBlackHuman();}//生產出白人男性@Overridepublic Human createWhiteHuman() {return new MaleWhiteHuman();}//生產出黃人男性@Overridepublic Human createYellowHuman() {return new MaleYellowHuman();}}

人種有了,八卦爐也有了,我們就來重現一下當年女媧造人的光景。

/*** @program: DesignMode* @description: 女媧重造人類* @author: Jacob* @create: 2020-08-18 17:51**/
public class NvWa {public static void main(String[] args) {//第一條生產線,男性生產線HumanFactory maleHumanFactory = new MaleFactory();//第二條生產線,女性生產線HumanFactory femaleHumanFactory = new FemaleFactory();//生產線建立完畢,開始生產人了:Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();Human femaleBlackHuman = femaleHumanFactory.createBlackHuman();Human femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();System.out.println("---生產一個黃色女性---");femaleYellowHuman.getColor();femaleYellowHuman.talk();femaleYellowHuman.getSex();System.out.println("---生產一個黑色女性---");femaleBlackHuman.getColor();femaleBlackHuman.talk();femaleBlackHuman.getSex();System.out.println("---生產一個白色女性---");femaleWhiteHuman.getColor();femaleWhiteHuman.talk();femaleWhiteHuman.getSex();Human maleYellowHuman = maleHumanFactory.createYellowHuman();Human maleBlackHuman = maleHumanFactory.createBlackHuman();Human maleWhiteHuman = maleHumanFactory.createWhiteHuman();System.out.println("\n---生產一個黃色男性---");femaleWhiteHuman.getColor();maleYellowHuman.talk();maleYellowHuman.getSex();System.out.println("\n---生產一個黃色男性---");maleBlackHuman.getColor();maleBlackHuman.talk();maleBlackHuman.getSex();System.out.println("\n---生產一個白色男性---");maleWhiteHuman.getColor();maleWhiteHuman.talk();maleWhiteHuman.getSex();}}
運行結果如下所示:
---生產一個黃色女性---
黃色人種的皮膚顏色是黃色的!
黃色人種會說話,一般說的都是雙字節。
黃色女性人種
---生產一個黑色女性---
黑色人種的皮膚顏色是黑色的!
黑色人種會說話,一般人聽不懂。
黑色女性人種
---生產一個白色女性---
白色人種的皮膚顏色是白色的!
白色人種會說話,一般說的都是單字節。
白色女性人種---生產一個黃色男性---
白色人種的皮膚顏色是白色的!
黃色人種會說話,一般說的都是雙字節。
黃色男性人種---生產一個黃色男性---
黑色人種的皮膚顏色是黑色的!
黑色人種會說話,一般人聽不懂。
黑色男性人種---生產一個白色男性---
白色人種的皮膚顏色是白色的!
白色人種會說話,一般說的都是單字節。
白色男性人種

各種膚色的男性、女性都制造出來了,兩性之間產生了相互吸引力,于是情感產生,這 個世界就多了一種小說的題材“愛情”。回頭來想想我們的設計,不知道大家有沒有去過工廠,每個工廠分很多車間,每個車間又分多條生產線,分別生產不同的產品,我們可以把八卦爐比喻為車間,把八卦爐生產的工藝(生產白人、黑人還是黃人)稱為生產線,如此來看就是一個女性生產車間,專門生產各種膚色的女性,一個是男性生產車間,專門生產各種膚色男性,生產完畢就可以在系統外組裝,什么是組裝?嘿嘿,自己思考!在這樣的設計下,各個車間和各條生產線的職責非常明確,在車間內各個生產出來的產品可以有耦合關系,你 要知道世界上黑、黃、白人種的比例是:1∶4∶6,那這就需要女媧娘娘在燒制的時候就要做好比例分配,在一個車間內協調好。這就是抽象工廠模式。

抽象工廠模式的定義

抽象工廠模式(Abstract Factory Pattern)是一種比較常用的模式,其定義如下:

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(為創建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的具體類。)

image-20200819145553018

抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的對象是一種非常好的解決方式。我們來看看抽象工廠的通用源代碼,首先有兩個互相影響的產品線(也叫做產品族),例如制造汽車的左側門和右側門,這兩個應 該是數量相等的——兩個對象之間的約束,每個型號的車門都是不一樣的,這是產品等級結 構約束的,我們先看看兩個產品族的類圖。

image-20200819145638541

注意類圖上的圈圈、框框相對應,兩個抽象的產品類可以有關系,例如共同繼承或實現 一個抽象類或接口。

/*** @program: DesignMode* @description: 抽象產品A類* @author: Jacob* @create: 2020-08-18 17:57**/
public abstract class AbstractProductA {//每個產品共有的方法public void shareMethod() {System.out.println("每個產品A共有的方法");}//每個產品相同方法,不同實現public abstract void doSomething();
}
/*** @program: DesignMode* @description: 產品A1的實現類* @author: Jacob* @create: 2020-08-18 17:58**/
public class ProductA1 extends AbstractProductA {@Overridepublic void doSomething() {System.out.println("產品A1的實現方法");}
}
/*** @program: DesignMode* @description: 產品A1的實現類* @author: Jacob* @create: 2020-08-18 17:58**/
public class ProductA2 extends AbstractProductA {@Overridepublic void doSomething() {System.out.println("產品A2的實現方法");}
}
/*** @program: DesignMode* @description: 抽象產品B類* @author: Jacob* @create: 2020-08-18 17:57**/
public abstract class AbstractProductB {//每個產品共有的方法public void shareMethod() {System.out.println("每個產品B共有的方法");}//每個產品相同方法,不同實現public abstract void doSomething();
}
/*** @program: DesignMode* @description: 產品B1實現類* @author: Jacob* @create: 2020-08-18 17:58**/
public class ProductB1 extends AbstractProductB {@Overridepublic void doSomething() {System.out.println("產品B1的實現方法");}
}
/*** @program: DesignMode* @description: 產品B2實現類* @author: Jacob* @create: 2020-08-18 17:58**/
public class ProductB2 extends AbstractProductB {@Overridepublic void doSomething() {System.out.println("產品B2的實現方法");}
}

抽象工廠類AbstractCreator的職責是定義每個工廠要實現的 功能,在通用代碼中,抽象工廠類定義了兩個產品族的產品創建。

/*** @program: DesignMode* @description: 抽象工廠類* @author: Jacob* @create: 2020-08-18 18:02**/
public abstract class AbstractCreator {//創建A產品家族public abstract AbstractProductA createProductA();//創建B產品家族public abstract AbstractProductB createProductB();}

注意:有N個產品族,在抽象工廠類中就應該有N個創建方法。


如何創建一個產品,則是由具體的實現類來完成的。

/*** @program: DesignMode* @description: 產品等級1的實現類* @author: Jacob* @create: 2020-08-18 18:03**/
public class Creator1 extends AbstractCreator {//只生產產品等級為1的A產品@Overridepublic AbstractProductA createProductA() {return new ProductA1();}//只生產產品等級為1的B產品@Overridepublic AbstractProductB createProductB() {return new ProductB1();}
}
/*** @program: DesignMode* @description: 產品等級1的實現類* @author: Jacob* @create: 2020-08-18 18:03**/
public class Creator2 extends AbstractCreator {//只生產產品等級為1的A產品@Overridepublic AbstractProductA createProductA() {return new ProductA2();}//只生產產品等級為1的B產品@Overridepublic AbstractProductB createProductB() {return new ProductB2();}
}

注意:有M個產品等級就應該有M個實現工廠類,在每個實現工廠中,實現不同產品族的生產任務。


在具體的業務中如何產生一個與實現無關的對象呢?

/*** @program: DesignMode* @description: 場景類* @author: Jacob* @create: 2020-08-18 18:08**/
public class Client {public static void main(String[] args) {//定義出兩個工廠AbstractCreator creator1 = new Creator1();AbstractCreator creator2 = new Creator2();//產生A1對象AbstractProductA a1 = creator1.createProductA();a1.doSomething();a1.shareMethod();//產生A2對象AbstractProductA a2 = creator2.createProductA();a2.doSomething();a2.shareMethod();//產生B1對象AbstractProductB b1 = creator1.createProductB();b1.doSomething();b1.shareMethod();//產生B2對象AbstractProductB b2 = creator2.createProductB();b2.doSomething();b2.shareMethod();}
}

在場景類中,沒有任何一個方法與實現類有關系,對于一個產品來說,我們只要知道它的工廠方法就可以直接產生一個產品對象,無須關心它的實現類。

運行結果如下所示:
產品A1的實現方法
每個產品A共有的方法
產品A2的實現方法
每個產品A共有的方法
產品B1的實現方法
每個產品B共有的方法
產品B2的實現方法
每個產品B共有的方法

抽象工廠模式的應用

抽象工廠模式的優點

  • 封裝性,每個產品的實現類不是高層模塊要關心的,它要關心的是什么?是接口,是抽象,它不關心對象是如何創建出來,這由誰負責呢?工廠類,只要知道工廠類是誰,我就能創建出一個需要的對象,省時省力,優秀設計就應該如此。

  • 產品族內的約束為非公開狀態。例如生產男女比例的問題上,猜想女媧娘娘肯定有自己的打算,不能讓女盛男衰,否則女性的優點不就體現不出來了嗎?那在抽象工廠模式,就 應該有這樣的一個約束:每生產1個女性,就同時生產出1.2個男性,這樣的生產過程對調用工廠類的高層模塊來說是透明的,它不需要知道這個約束,我就是要一個黃色女性產品就可以了,具體的產品族內的約束是在工廠內實現的。

抽象工廠模式的缺點

抽象工廠模式的最大缺點就是產品族擴展非常困難,為什么這么說呢?我們以通用代碼 為例,如果要增加一個產品C,也就是說產品家族由原來的2個增加到3個,看看我們的程序 有多大改動吧!抽象類AbstractCreator要增加一個方法createProductC(),然后兩個實現類都要修改,想想看,這嚴重違反了開閉原則,而且我們一直說明抽象類和接口是一個契約。改變 契約,所有與契約有關系的代碼都要修,那么這段代碼叫什么?叫“有毒代碼”,——只要與這段代碼有關系,就可能產生侵害的危險!

抽象工廠模式的使用場景

抽象工廠模式的使用場景定義非常簡單:一個對象族(或是一組沒有任何關系的對象)都有相同的約束,則可以使用抽象工廠模式。什么意思呢?例如一個文本編輯器和一個圖片處理器,都是軟件實體,但是*nix下的文本編輯器和Windows下的文本編輯器雖然功能和界
面都相同,但是代碼實現是不同的,圖片處理器也有類似情況。也就是具有了共同的約束條件:操作系統類型。于是我們可以使用抽象工廠模式,產生不同操作系統下的編輯器和圖片處理器。

抽象工廠模式的注意事項

在抽象工廠模式的缺點中,我們提到抽象工廠模式的產品族擴展比較困難,但是一定要清楚,是產品族擴展困難,而不是產品等級。在該模式下,產品等級是非常容易擴展的,增加一個產品等級,只要增加一個工廠類負責新增加出來的產品生產任務即可。也就是說橫向
擴展容易,縱向擴展困難。以人類為例子,產品等級中只有男、女兩個性別,現實世界還有一種性別:雙性人,既是男人也是女人(俗語就是陰陽人),那我們要擴展這個產品等級也是非常容易的,增加三個產品類,分別對應不同的膚色,然后再創建一個工廠類,專門負責不同膚色人的雙性人的創建任務,完全通過擴展來實現需求的變更,從這一點上看,抽象工廠模式是符合開閉原則的。

最佳實踐

一個模式在什么情況下才能夠使用,是很多讀者比較困惑的地方。抽象工廠模式是一個簡單的模式,使用的場景非常多,大家在軟件產品開發過程中,涉及不同操作系統的時候, 都可以考慮使用抽象工廠模式,例如一個應用,需要在三個不同平臺(WindowsLinuxAndroidGoogle發布的智能終端操作系統))上運行,你會怎么設計?分別設計三套不同的應用?非也,通過抽象工廠模式屏蔽掉操作系統對應用的影響。三個不同操作系統上的軟 件功能、應用邏輯、UI都應該是非常類似的,唯一不同的是調用不同的工廠方法,由不同的產品類去處理與操作系統交互的信息。

學習于:《設計模式之禪》 — 秦小波

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

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

相關文章

strip 命令的使用方法

用途 通過除去綁定程序和符號調試程序使用的信息,降低擴展公共對象文件格式(XCOFF)的對象文件的大小。 語法 strip [ -V ] [ -r [ -l ] | -x [ -l ] | -t | -H | -e | -E ] [ -X {32 |64 |32_64 }] [ -- ] File ... 描…

設計模式 之 模板模式

項目源碼:https://gitee.com/Jacob-gitee/DesignMode 個人博客 :http://jacob.org.cn 女媧的失誤 工廠模式中講了女媧造人的故事。人是造出來了,世界也熱鬧了,可是低頭一看,都是清一色的類型,缺少關愛、仇…

使用Java高速實現進度條

基于有人問到如何做進度條,以下給個簡單的做法: 主要是使用JProgressBar(Swing內置javax.swing.JProgressBar)和SwingWorker(Swing內置javax.swing.SwingWorker) 有人肯定會說,不是用線程做的嗎…

Linux 安裝JDK

個人博客 :https://www.siyuan.run CSDN:https://blog.csdn.net/siyuan 微信小程序:思遠Y 安裝時使用到的命令: cd:切換目錄。 eg:cd / mkdir:創建目錄。 eg:mkdir jacob 創建單極目…

Css導航

<div> <ul> <li><a></a></li> <li><a></a></li> <li><a></a></li> .. </ul> </div> <li>中也可包含 <ul> <a></a> <li><a></a>&…

關于js的function.來自百度知道的回答,學習了.

在js中&#xff0c;創建一個函數對象的語法是var myFunction new Function(arg1,…,agrN, body);其中&#xff0c;該函數對象的N個參數放在 函數主體參數body的前面&#xff0c;即函數主體參數必須放在參數列表的最后&#xff0c;也可以無參數new Function(body)。你添加第三個…

Ribbon 支持的9大負載均衡策略

個人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思遠Y 線性輪詢策略&#xff1a; RoundRibbonRule BaseLoadBalancer 負載均衡器默認采用線性負載輪詢負載均衡策略。 工作流程&#xff1a; RoundRibbonRule…

fedora20開機啟動配置:systemctl

老版fedora中使用chkconfig配置開機啟動&#xff0c;fedora20中&#xff0c;使用chkconfig會出現各種問題。使用systemctl配置。 具體表格如下 轉載于:https://www.cnblogs.com/hh6plus/p/5548083.html

Mysql 字符操作函數相關

常用的字符串函數&#xff1a; 函數說明CONCAT(s1,s2&#xff0c;...)返回一個或多個待拼接的內容&#xff0c;任意一個為NULL則返回值為NULL。CONCAT_WS(x,s1,s2,...)返回多個字符串拼接之后的字符串&#xff0c;每個字符串之間有一個x。SUBSTRING(s,n,len)、MID(s,n,len)兩個…

“cvSnakeImage”: 找不到標識符

1>g:\project\opencv\helloopencv\helloopencv\helloopencv.cpp(74) : error C2065: “CV_VALUE”: 未聲明的標識符1>g:\project\opencv\helloopencv\helloopencv\helloopencv.cpp(74) : error C3861: “cvSnakeImage”: 找不到標識符 增加頭文件 #include <opencv2/l…

Shell 快速入門

個人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思遠Y 概述 Shell 是一個用 C 語言編寫的程序&#xff0c;它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言&#xff0c;又是一種程序設計語言。 Shell…

Andriod開發 --插件安裝、環境配置、問題集錦

1.用Eclipse搭建Android開發環境和創建第一個Android項目&#xff08;Windows平臺&#xff09; 鏈接閱讀http://www.cnblogs.com/allenzheng/archive/2012/11/10/2762379.html 搭建環境中的不同之處&#xff1a; &#xff08;1&#xff09;我在安裝過程中&#xff0c;在安裝ADT…

《Java 高并發》01 高并發基本概念

基本概念 同步和異步 同步和異步通常是用來形容一次方法調用。 同步方法調用一旦開始&#xff0c;調用者必須等到方法返回才能繼續執行后續操作。 異步方法調用更像一個消息傳遞&#xff0c;一旦開始&#xff0c;方法調用就會立即返回&#xff0c;調用者就可以繼續后續的操…

Android之Http網絡編程(四)

前面幾篇博文簡單的介紹了一些常見的Http的操作&#xff0c;這些操作幾乎都是在新開的線程中進行的網絡請求&#xff0c;并在日志中打印出獲取到的網絡數據。那么&#xff0c;問題來了&#xff01;&#xff08;呃~感覺下一句是藍翔有木有&#xff1f;&#xff09;如何在把獲取到…

《Java 高并發》02 多線程的特性

多線程的三大特性&#xff1a;原子性、可見性和有序性。 原子性 原子性是指一個操作或者多個操作&#xff0c;一旦開始就不會被其他線程干擾&#xff0c;即使是在多個線程一起執行的情況下也不會被干擾。或者不執行。 原子性主要是為了保證數據一致&#xff0c;線程安全問題…

U3D-FSM有限狀態機的簡單設計

http://coder.beitown.com/archives/592 在之前的文章里介紹了一個基礎U3D狀態機框架&#xff08;Unity3D游戲開發之狀態流框架&#xff09;即大Switch的枚舉狀態控制。這種方法雖然容易理解&#xff0c;編程方法也相對簡單&#xff0c;但是弊端是當狀態變得復雜之后&#xff0…

《Java 高并發》04 線程的基本操作

新建線程 新建線程很簡單。只要使用new 關鍵字創建一個線程對象&#xff0c;并且調用 start 方法啟動線程。 Thread t new Thread(); t.start();注意&#xff1a;run 方法不是用來啟動線程。如果調用 run 方法它只會作為普通方法來執行&#xff0c;而不會開啟線程執行。 終止…

Dispatch 方法簡介

后臺執行 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //后臺程執行 something; }); 主線程執行 dispatch_async(dispatch_get_main_queue(), ^{// 主線程執行something; }); 一次性執行 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // 主…

linux雜七雜八整理

64系統里執行32位程序&#xff1a; 1、在64系統里執行32位程序如果出現/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory&#xff0c;安裝下glic即可sudo yum install glibc.i6862、error while loading shared libraries: libz.so.1: cannot …

《Java 高并發》05 線程的基本操作

volatile 與 Java 內存模型 Java 內存模型都是圍繞著原子性、有序性和可見性展開的。為了在適當的場合&#xff0c;確保線程間的原子性、有序性和可見性。Java 使用了一些特許的操作或者關鍵字來申明、告訴虛擬機&#xff0c;在這個地方&#xff0c;要尤其注意&#xff0c;不能…