單例模式
特點(diǎn):
單例類只能有一個(gè)實(shí)例
單例類必須自己創(chuàng)建自己的唯一實(shí)例
單例類必須給所有其它對(duì)象提供這一實(shí)例
分為懶漢式、餓漢式和登記式三種方式娩鹉。
餓漢式
類被加載時(shí),該類靜態(tài)實(shí)例被初始化:
public class EagerSingleton {
private static final EagerSingleton m_instance = new EagerSingleton();
private EagerSingleton(){}
public static EagerSingleton getM_instance(){
return m_instance;
}
}
懶漢式
"懶"體現(xiàn)在用到時(shí)稚伍,該實(shí)例才會(huì)被初始化:
public class LazySingleton {
private static LazySingleton m_instance = null;
private LazySingleton(){}
synchronized public static LazySingleton getM_instance(){
if(m_instance == null){
m_instance = new LazySingleton();
}
return m_instance;
}
}
構(gòu)造函數(shù)私有,說明不能被繼承戚宦;同步保證多線程間的線程安全个曙。
登記式
為解決上述兩者不可被繼承的缺點(diǎn)設(shè)計(jì)
public class RegSingleton {
static private HashMap m_registry = new HashMap();
static{
RegSingleton x = new RegSingleton();
m_registry.put(x.getClass().getName(),x);
}
protected RegSingleton(){}
static public RegSingleton getInstance(String name)
{
if(name == null)
{
name = "com.javapatterns.singleton";
}
if(m_registry.get(name) == null) {
try {
m_registry.put(name, Class.forName(name).newInstance());
}catch (Exception e){
System.out.println("Error happened.");
}
}
return (RegSingleton) m_registry.get(name);
}
}
注:雙重檢查對(duì)JAVA是不成立的,因?yàn)樵贘AVA編譯器中受楼,LazySingleton類的初始化與m_instance變量賦值的順序不可預(yù)料垦搬,如果一個(gè)線程在沒有同步化的條件下讀取m_instance引用,并調(diào)用這個(gè)對(duì)象方法的話艳汽,可能會(huì)發(fā)現(xiàn)對(duì)象的初始化過程尚未完成猴贰,從而造成崩潰(初始化了一半,調(diào)用的是未初始化的部分)河狐。
建造者模式
對(duì)象:導(dǎo)演米绕、抽象建造者瑟捣、具體建造者、產(chǎn)品栅干。
也就是一個(gè)多口味可樂工廠迈套,里面有多個(gè)車間生產(chǎn)可樂,每種飲料都有相同種類的配料(如水碱鳞、糖桑李、焦糖、口味劑等)窿给,這些配料即為"產(chǎn)品"贵白,不一樣口味的可樂需要不一樣的口味劑,車間即為"具體建造者"崩泡,把相同的部分抽象出來即為"抽象建造者"禁荒,另外有一個(gè)指揮的"導(dǎo)演者"作為銷售總監(jiān)規(guī)劃著生產(chǎn)什么可樂。而工廠模式關(guān)心的是一個(gè)工廠中產(chǎn)品的具體行程允华。兩者的關(guān)系如同一維和二維空間的區(qū)別圈浇,一維空間關(guān)注兩個(gè)點(diǎn)的關(guān)系,二維空間關(guān)注兩條線的關(guān)系靴寂,而很少關(guān)注點(diǎn)的問題磷蜀。
原始模式:
通過給出的一個(gè)原型對(duì)象來指明所要?jiǎng)?chuàng)建的對(duì)象類型,然后用復(fù)制這個(gè)原型對(duì)象的方法創(chuàng)建出更多同類型對(duì)象百炬,分為
1)簡單形式褐隆,客戶角色(Client),抽象原型(Cloneable類)剖踊,具體原型(extends Cloneable的類).
2)登記形式.多一個(gè)原型管理器庶弃,用于記錄每一個(gè)被創(chuàng)建的對(duì)象。
應(yīng)用:深淺拷貝德澈。
優(yōu)點(diǎn):允許動(dòng)態(tài)增加或減少產(chǎn)品類歇攻,并且產(chǎn)品類不需要有任何事先確定的等級(jí)結(jié)構(gòu),而工廠類則需要一個(gè)與產(chǎn)品類等級(jí)結(jié)構(gòu)相同的等級(jí)結(jié)構(gòu)梆造。