Java---設計模組(設計模組的簡介及最簡單的倆個單例程式碼加測試)
設計模式學習概述:
★ 為什麼要學習設計模式
1、設計模式都是一些相對優秀的解決方案,很多問題都是典型的、有代表性的問題,學習設計模式,我們就不用自己從頭來解決這些問題,相當於在巨人的肩膀上,複用這些方案即可。
2、設計模式已經成為專業人士的常用詞彙,不懂不利於交流。
3、能讓你設計的系統更加專業,讓系統有更好的架構。
★ 學習設計模式的層次
1、基本入門級——套用型(半年到一年左右時間領悟學會)
2、基本掌握級——可變形使用型(一年左右時間領悟學會)
3、真正理解和掌握級——思想上吸收和趨同型(看個人天賦,不確定時間學會)
設計模式1——單例
解決:保證了一個類在記憶體中只能有一個物件。
思路:
1、如果其他程式能夠隨意用new建立該類物件,那麼就無法控制個數。因此,不讓其他程式用new建立該類的物件。
2、既然不讓其他程式new該類物件,那麼該類在自己內部就要建立一個物件,否則該類就永遠無法建立物件了。
3、該類將建立的物件對外(整個系統)提供,讓其他程式獲取並使用。
步驟:
1、 將該類中的建構函式私有化。
2、在本類中建立一個本類物件。
3、定義一個方法,返回值型別是本類型別。讓其他程式通過該方法就可以獲取到該類物件。
第一種方法:
package cn.hncu.pattern.singleton.one;
/*
* 餓漢式
*/
public class Single {
private static final Single S = new Single();
private Single(){
}
public static Single getInstance(){
return S;
}
}
測試的類:
package cn.hncu.pattern.singleton.one;
public class TestSingle {
public static void main(String[] args) {
System.out .println(Single.getInstance());
System.out.println(Single.getInstance());
System.out.println(Single.getInstance());
System.out.println(Single.getInstance());
System.out.println(Single.getInstance());
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
//測試地址值是否相等
System.out.println(s1==s2);
}
}
測試結果:
cn.hncu.pattern.singleton.one.Single@bcda2d
cn.hncu.pattern.singleton.one.Single@bcda2d
cn.hncu.pattern.singleton.one.Single@bcda2d
cn.hncu.pattern.singleton.one.Single@bcda2d
cn.hncu.pattern.singleton.one.Single@bcda2d
true
第二種方法:
package cn.hncu.pattern.singleton.two;
/*
* 懶漢式
*/
public class Single {
private static Single s = null;
private Single(){
}
//單例的延遲載入方式,有一個小bug,就是多執行緒載入時,會出現多次new的情況
//下面給出解決這個延遲的問題。
// public static Single getInstance(){
// if(s==null){
// s = new Single();
// }
// return s;
// }
//優化方案---多執行緒加鎖,誰呼叫鎖誰,每次只能讓一個執行緒呼叫
public static synchronized Single getInstance(){
if(s==null){
s = new Single();
}
return s;
}
}
測試的類:
package cn.hncu.pattern.singleton.two;
public class TestSingle2 {
public static void main(String[] args) {
Thread[] td = new Thread[50];
//給一個執行緒陣列
for(int i=0;i<td.length;i++){
td[i] = new useSingle();
}//new出每一個執行緒
for(int i=0;i<td.length;i++){
td[i].start();
}
}
}
class useSingle extends Thread {
@Override
public void run() {
Single obj = Single.getInstance();
System.out.println(obj);
}
}
測試結果:
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
相關推薦
Java---設計模組(設計模組的簡介及最簡單的倆個單例程式碼加測試)
設計模式學習概述: ★ 為什麼要學習設計模式 1、設計模式都是一些相對優秀的解決方案,很多問題都是典型的、有代表性的問題,學習設計模式,我們就不用自己從頭來解決這些問題,相當於在巨人的肩膀上,複用這些方案即可。 2、設計模式已經成為專業人士的常用詞彙,不懂
java程式猿應該瞭解的10個面向物件設計原則(每次看都很有感悟,特意拿來和大家共享)
Java程式設計最基本的原則就是要追求高內聚和低耦合的解決方案和程式碼模組設計。檢視Apache和Sun的開放原始碼能幫助你發現其他Java設計原則在這些程式碼中的實際運用。 面向物件設計原則是OOPS(Object-Oriented Programming System,
Java面試二(設計模式)
基礎二 設計模式概要 建立型模式 1. 單例模式 一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 2. 工廠模式 定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。 比如你和老
node總結之工具模組(Domain 模組)
Node.js Domain(域) 簡化非同步程式碼的異常處理,可以捕捉處理try catch無法捕捉的異常,來看下引入 Domain 模組的語法格式: var domain = require("domain") domain模組,把處理多個不同的IO的操作作為一個組。註冊事件和回撥到
node總結之工具模組(Net 模組)
Node.js Net 模組提供了一些用於底層的網路通訊的小工具,包含了建立伺服器/客戶端的方法,來看下引入該模組的語法格式: var net = require("net") 來看下net模組中的方法: 序號 方法 & 描述
node總結之工具模組(Path 模組)
Node.js path 模組提供了一些用於處理檔案路徑的小工具,來看下引入該模組的語法格式: var path = require("path") 來看下方法: 序號 方法 & 描述 1 path.nor
node總結之工具模組(OS 模組)
Node.js os 模組提供了一些基本的系統操作函式,來看下引入該模組的語法格式: var os = require("os") 來看下其中包含的方法: 序號 方法 & 描述 1 os.tmpdir()
node總結之工具模組(DNS 模組)
Node.js DNS 模組用於解析域名,來看下引入 DNS 模組的語法格式: var dns = require("dns") 來看下dns模組中包含的方法: 序號 方法 & 描述 1 dns.looku
logging模組(日誌模組)
目錄 一、日誌級別 二、函式式簡單配置 三、logger物件配置 四、logging模組的Formatter,Handler,Logger,Filter物件 五、Logger與Handler的級別 六、Logger的繼承(瞭解) 七、應用 django的配置
day21,常用模組(collections模組,time時間模組,random模組,os和sys模組)
一,模組簡單的認識: 什麼是模組. 模組就是我們把裝有特定功能的程式碼進行歸類的結果. 從程式碼編寫的單位 來看我們的程式, 從小到 大的順序: 一條程式碼 < 語句塊 < 程式碼塊(函式, 類) < 模組. 我們目前寫 的所有的py檔案都是模組. import
Python(十)模組(使用模組,安裝模組,作用域)
模組定義 在計算機程式的開發過程中,隨著程式程式碼越寫越多,在一個檔案裡程式碼就會越來越長,越來越不容易維護。 為了編寫可維護的程式碼,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的程式碼就相對較少,很多程式語言都採用這種組織程式碼的方式。在Python中,一個.py檔案就稱
java設計模式精講 Debug 方式+記憶體分析 第8章 單例模式
單例模式 8-1 單例模式講解 8-2 單例設計模式-懶漢式及多執行緒Debug實戰 8-3 單例設計模式-DoubleCheck雙重檢查實戰及原理解析 8-4 單例設計模式-靜態內部類-基於類初始化的延遲載入解決方案及原理解析 8-5 單例設計
設計模式之單例模式(關鍵詞:設計模式/單例模式/單件模式)
設計模式 單例模式 定義 單例模式:允許一些物件中只存在 1 個例項。 類裝飾器版本 1:使用 1 個全域性字典,儲存所有類的例項。 instances = {} def getInstances(aClass, *args): if aClass not in i
os 模組( os模組是與作業系統互動的一個介面)
os.makedirs('dirname1/dirname2') 可生成多層遞迴目錄 os.removedirs('dirname1') 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推 os.mkdir('dirname') 生成單級目錄;相當於shell中mkd
sys模組(sys模組是與python直譯器互動的一個介面)
sys.argv 命令列引數List,第一個元素是程式本身路徑 sys.exit(n) 退出程式,正常退出時exit(0),錯誤退出sys.exit(1) sys.version 獲取Python解釋程式的版本資訊 sys.path 返
少說話多寫程式碼之Python學習061——標準模組(time模組)
日期模組主要是處理日期的,可以實現獲取當前時間、操作時間和日期、將字串格式化為日期以及將日期格式化為字串。 主要函式有, asctime 將時間元組轉換為字元 localtime 將秒數轉換為日期元組, mktime 將時間元組轉換為本地時間 sleep 休眠 strptime 將字串解析為時間
少說話多寫程式碼之Python學習062——標準模組(random模組)
random主要是產生隨機數。不過實際上,不論哪種語言中所謂的隨機數,其實都不是真正意義的隨機數。random中的SystemRandom可以讓資料接近真正的隨機數。 我們通過下面的例子來看看隨機數的使用。 我們在一段時間內產生隨機時間。 from random import * from
少說話多寫程式碼之Python學習063——標準模組(shelve模組)
如果我們只需要存少量的資料,一個簡單的儲存方案是使用shelve模版。我們只需要給他提供一個指定路徑的檔名。shelve呼叫過程是, 先呼叫open函式,引數為檔名。返回值是一個shell物件。這個物件可以用來儲存資料,可以作為一個字典來操作,但是鍵一定是字串型別的。操作完成後呼叫close函式
少說話多寫程式碼之Python學習065——標準模組(re模組)
Python的re模組主要是正則表示式的操作函式。我們看看主要的幾個函式。 首先我們要引入re模組。 import re compile將包含正則表示式字串建立為物件。 search在目標字串中按照給定的正則表示式匹配結果 match在字串的開始處匹配指定正則表示式 split根據正則表
ueditor富文字編輯器java使用及最簡單的配置(ssh)
之前用過ueditor,結果這兩天要用又忘了怎麼用了,寫個文件記錄下來 1. UEditor簡介 UEditor是由百度web前端研發部開發所見即所得富文字web編輯器,具有輕量,可定製,注重使用者體驗等特點,開源基於MIT協議,允許自由使