1.單例設計模式
解決的問題:就是可以保證一個類在內存中的對象唯一性。比如對於多個程序使用同一個配置信息對象時,就需要保證該對象的唯一性。
如何保證對象的唯一性呢?
1.不允許其他程序用new來創建該類對象。
2.在該類中創建一個本類實例。
3.對外提供一個方法讓其他程序可以獲取該對象。
步驟:
1.私有化該類的構造函數
2.通過new在本類中創建的一個本類對象
3.定義一個公有的靜態方法,將創建的對象返回
單例模式之餓漢式
代碼:
package day08;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
public class ConfigureFile {
private static final ConfigureFile configureFile=new ConfigureFile();
private ConfigureFile()
{}
public static ConfigureFile getInstance()
{
return configureFile;
}
public HashMap<String,String> getInfo() throws IOException
{
HashMap<String,String> map=new HashMap<String, String>();
Properties p=new Properties();
FileReader fr=new FileReader("D:\\1.properties");
p.load(fr);
// Enumeration<?> en=p.propertyNames();
// ArrayList<?> list=Collections.list(en);
// for(ListIterator<?> it=list.listIterator();it.hasNext();)
// {
// String key=(String)it.next();
// map.put(key, p.getProperty(key));
// }
Set<String> set=p.stringPropertyNames();
for(Iterator<String> it=set.iterator();it.hasNext();)
{
String key=it.next();
map.put(key, p.getProperty(key));
}
return map;
}
}
package day08;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class SingleEntityMode {
public static void main(String[] args) throws IOException
{
ConfigureFile configure=ConfigureFile.getInstance();
HashMap<String, String> map=configure.getInfo();
//keySet(),entrySet(),values等方法遍歷地圖
Set<Entry<String, String>> set=map.entrySet();
for(Iterator<Entry<String, String>> it=set.iterator();it.hasNext();)
{
Entry<String, String> e=it.next();
String key=e.getKey();
String value=e.getValue();
System.out.println(key+" : "+value);
}
}
}
單例模式之懶漢式
代碼如下:
package day08;
public class LazyMenMode {
private static LazyMenMode lazy;
private LazyMenMode()
{}
public static LazyMenMode getInstance()
{
if(null==lazy)
{
lazy = new LazyMenMode();
}
return lazy;
}
}
不過這種在多線程中,存在線程安全問題。以下來分析一下,比如線程1和線程2在獲取該類實例,線程1進來判斷null==lazy成立後,沒有執行下去,就被中斷了,這時線程2進來就會產生兩個不同的實例,就不能保證該類在內存中的實例唯一。改進如下:
package day08;
public class LazyMenMode {
private static LazyMenMode lazy;
private LazyMenMode()
{}
public static LazyMenMode getInstance()
{
if(null==lazy)
{
synchronized(LazyMenMode.class)
{
if(null==lazy)
{
lazy = new LazyMenMode();
}
}
}
return lazy;
}
}