一、建造者模式(Builder)
工廠類模式提供的是創建單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來創建復合物件,所謂復合物件就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最后的Test結合起來得到的,我們看一下代碼:
還和前面一樣,一個Sender介面,兩個實作類MailSender和SmsSender,最后,建造者類如下:
- public class Builder {
- private List<Sender> list = new ArrayList<Sender>();
- public void produceMailSender(int count){
- for(int i=0; i<count; i++){
- list.add(new MailSender());
- }
- }
- public void produceSmsSender(int count){
- for(int i=0; i<count; i++){
- list.add(new SmsSender());
- }
- }
- }
測驗類:
- public class Test {
- public static void main(String[] args) {
- Builder builder = new Builder();
- builder.produceMailSender(10);
- }
- }
從這點看出,建造者模式將很多功能集成到一個類里,這個類可以創造出比較復雜的東西,所以與工程模式的區別就是:工廠模式關注的是創建單個產品,而建造者模式則關注創建符合物件,多個部分,因此,是選擇工廠模式還是建造者模式,依實際情況而定,
二、原型模式(Prototype)
原型模式雖然是創建型的模式,但是與工程模式沒有關系,從名字即可看出,該模式的思想就是將一個物件作為原型,對其進行復制、克隆,產生一個和原物件類似的新物件,本小結會通過物件的復制,進行講解,在Java中,復制物件是通過clone()實作的,先創建一個原型類:
- public class Prototype implements Cloneable {
- public Object clone() throws CloneNotSupportedException {
- Prototype proto = (Prototype) super.clone();
- return proto;
- }
- }
很簡單,一個原型類,只需要實作Cloneable介面,覆寫clone方法,此處clone方法可以改成任意的名稱,因為Cloneable介面 是個空介面,你可以任意定義實作類的方法名,如cloneA或者cloneB,因為此處的重點是super.clone()這句 話,super.clone()呼叫的是Object的clone()方法,而在Object類中,clone()是native的,具體怎么實作,我會 在另一篇文章中,關于解讀Java中本地方法的呼叫,此處不再深究,在這兒,我將結合物件的淺復制和深復制來說一下,首先需要了解物件深、淺復制的概念:
淺復制:將一個物件復制后,基本資料型別的變數都會重新創建,而參考型別,指向的還是原物件所指向的,
深復制:將一個物件復制后,不論是基本資料型別還有參考型別,都是重新創建的,簡單來說,就是深復制進行了完全徹底的復制,而淺復制不徹底,
此處,寫一個深淺復制的例子:
- public class Prototype implements Cloneable, Serializable {
- private static final long serialVersionUID = 1L;
- private String string;
- private SerializableObject obj;
- /* 淺復制 */
- public Object clone() throws CloneNotSupportedException {
- Prototype proto = (Prototype) super.clone();
- return proto;
- }
- /* 深復制 */
- public Object deepClone() throws IOException, ClassNotFoundException {
- /* 寫入當前物件的二進制流 */
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(bos);
- oos.writeObject(this);
- /* 讀出二進制流產生的新物件 */
- ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
- ObjectInputStream ois = new ObjectInputStream(bis);
- return ois.readObject();
- }
- public String getString() {
- return string;
- }
- public void setString(String string) {
- this.string = string;
- }
- public SerializableObject getObj() {
- return obj;
- }
- public void setObj(SerializableObject obj) {
- this.obj = obj;
- }
- }
- class SerializableObject implements Serializable {
- private static final long serialVersionUID = 1L;
- }
要實作深復制,需要采用流的形式讀入當前物件的二進制輸入,再寫出二進制資料對應的物件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/155278.html
標籤:Java
