可參考:
總體來說設計模式分為三大類:
六大原則:
本文章先**建立型的設計模式。
——優點:
——適用情景:
——應用例項:
普通工廠模式分為三種:
就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。
public inte***ce sender
public class mailsender implements sender
}
public class smssender implements sender
}
public class sendfactory
}
public class factorytest
}
對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。
將上面的**做下修改,改動下sendfactory類就行,如下:
public class sendfactory
public sender producesms()
}
將上面的多個工廠方法模式裡的方法置為靜態的,不需要建立例項,直接呼叫即可。
public class sendfactory
public static sender producesms()
}
普通工廠模式有乙個問題:如果要拓展程式,必須對工廠類進行修改,這違背了開閉原則。而抽象工廠模式,建立多個工廠類,一旦需要增加新功能,直接增加新的工廠類就可以了,不需要修改之前的**。
——優點:
——適用情景:
——應用例項:
public inte***ce produce
實現類:
public class cpu implements produce
@override
public void produce()
}
public class memory implements produce
@override
public void produce()
}
工廠介面:
public inte***ce ifactory
工廠實現類:
public class macfactory implements ifactory
@override
public produce creatememory(string name)
}
public class lenovofactory implements ifactory
@override
public produce creatememory(string name)
}
public class factorytest
}
——適用場景:
——應用例項:
public class singleton //將建構函式私有化,不允許外部類直接建立物件
private static singleton instance=new singleton();
public static singleton getinstance()
}
public class singleton
public static singleton getinstance()
} return instance;
} }
該方法既可以實現執行緒安全,又可以保證效能不受影響,解決了上述的問題,可以說是完美的。但理論是完美的,現實是殘酷的。該方法在很多優化編譯器上是也不完全安全,原因在於//3的**在不同編譯器上的行為是無法預知的。乙個優化編譯器可以合法地如下實現 instance=new singleton():
但jvm並不保證後兩個操作的先後順序。假設兩線程同時呼叫getinstance(),執行緒a先進入,在執行到//3時jvm可能先為新的singleton例項分配空間,然後直接賦值給instance成員,然後再去初始化這個singleton例項。這樣就有可能出錯了。執行緒a離開synchronized塊後,執行緒b進入,b看到的是instance已經不是null了(記憶體已經分配),於是它開始放心地使用instance,但這個是錯誤的,因為a還沒有來得及完成instance的初始化,而執行緒b就返回了未被初始化的instance例項。
解決方法是:變數instance使用volatile修飾,禁止指令重排優化(jdk1.5版本後有效)
該方法使用內部類來做到延遲載入物件,而且其載入過程是執行緒安全的。這種寫法完全使用了jvm的機制,它能保證當乙個類被載入的時候,這個類的載入過程是執行緒互斥的。這樣當我們第一次呼叫getinstance的時候,jvm能夠幫我們保證instance只被建立一次,並且會保證把賦值給instance的記憶體初始化完畢,這樣我們就不用擔心上面的問題。內部類singletonholder只有在getinstance()方法第一次呼叫的時候才會被載入。
public class singleton
private static class singletonholder
public static singleton getinstance()
}
——優點:
——適用場景:
——應用例項
建造者模式和工廠模式的區別:當創造乙個物件需要很多步驟時適合使用建造者模式。而當只需呼叫乙個方法就可以簡單地建立整個物件時適合使用工廠模式。
產品類,由多個部件組成
public class produce
public void show()
}
抽象創造者類
public abstract class builder
public class macbuilder extends builder
@override
public void buildermemory()
@override
public produce getresult()
}
public class lenovobuilder extends builder
@override
public void buildermemory()
@override
public produce getresult()
}
指揮者類
public class director
}
public class buildertest
}
該模式的思想就是將乙個物件作為原型,對其進行複製、轉殖,產生乙個和原物件類似的新物件。乙個原型類,只需要實現cloneable介面,super.clone()呼叫的是object的clone()方法。
首先需要了解物件深、淺複製的概念:
——優點:
——適用場景:
public class rectangle implements cloneable,serializable
public object clone() throws clonenotsupportedexception
}
public class geometry implements cloneable,serializable
public object clone() throws clonenotsupportedexception
/* 深複製 當原型類較複雜是,採用流的形式讀入當前物件的二進位制輸入,再寫出二進位制資料對應的物件*/
public object deepclone() throws ioexception, classnotfoundexception
}
public class prototest
}
Java設計模式 建立型 工廠模式
甲公司說他們需要一批商品,乙公司說你需要什麼商品,我們都有。但是甲公司還沒有確定是否找乙公司合作,所以具體需要什麼商品還沒有詳談,可以做什麼也不知道,但是對於商品的需求是明確的。public inte ce product雖然甲公司還沒有確定找乙公司合作,但是生產商品的工廠,乙公司還是要有的,如果連...
java建立型設計模式 抽象工廠模式
模式理解 該模式跟工廠模式的區別就是,工廠模式對應著乙個工廠,而抽象工廠模式對應多個工廠,就是說將多個工廠抽象出乙個類,先通過這個類來建立對應工廠,然後再通過工廠實現工廠中相應的方法 運用場景 兩個串聯開關的時候使用,無所謂多個工廠型別是否相同 示例 先設計兩個介面 public inte ce i...
建立型設計模式
建立型設計模式對類的建立例項化過程進行抽象,將物件的建立和物件的使用分離。簡單工廠模式 使用頻率4星 工廠方法模式 使用頻率5星 抽象工廠模式 使用頻率5星 建造者模式 使用頻率2星 原型模式 使用頻率3星 單例模式 使用頻率4星 toc 簡單工廠模式將物件建立和物件使用相分離,降低了系統耦合度。優...