炒冷飯系列:設計模式 原型模式

炒冷飯系列:設計模式 原型模式

摘要: 原創出處: http://www.cnblogs.com/Alandre/ 泥沙磚瓦漿木匠 但願轉載,保留摘要,謝謝!html

親愛我,孝何難;親惡我,孝方賢。

1、什麼是原型模式

Prototype模式是一種對象建立型模式,它採起復制原型對象的方法來建立對象的實例。使用 Prototype模式建立的實例,具備與原型同樣的 數據。java

2、原型模式的特色

  • 1. 由原型對象自身建立目標對象。也就是說,對 象建立這一動做發自原型對象自己。設計模式

  • 2.目標對象是原型對象的一個克隆。也就是說, 經過Prototype模式建立的對象,不單單與原型 對象具備相同的結構,還與原型對象具備相同的 值。ide

  • 3.根據對象克隆深度層次的不一樣,有淺度克隆與 深度克隆。測試

3、原型模式應用場景及實現

  • - 在建立對象的時候,咱們不僅是但願被建立的對象繼承 其基類的基本結構,還但願繼承原型對象的數據。this

  • - 但願對目標對象的修改不影響既有的原型對象(深度克 隆的時候能夠徹底互不影響)。spa

  • - 隱藏克隆操做的細節。不少時候,對對象自己的克隆需 要涉及到類自己的數據細節。設計

淺度克隆code

複製代碼

import java.util.ArrayList;import java.util.List;public class Person implements Cloneable
{    private String nanme;    private String sex;    private int age;    private List<String> friends;    
    public String getNanme()
    {        return nanme;
    }    public void setNanme(String nanme)
    {        this.nanme = nanme;
    }    public String getSex()
    {        return sex;
    }    public void setSex(String sex)
    {        this.sex = sex;
    }    public int getAge()
    {        return age;
    }    public void setAge(int age)
    {        this.age = age;
    }    

    public List<String> getFriends()
    {        return friends;
    }    public void setFriends(List<String> friends)
    {        this.friends = friends;
    }

               @Override    protected Person clone() throws CloneNotSupportedException
    {        return (Person)super.clone();
    }
    
}

複製代碼

MainClass:htm

複製代碼

import java.util.ArrayList;import java.util.List;public class MainClass
{    public static void main(String[] args) throws CloneNotSupportedException
    {
        Person person = new Person();
        person.setNanme("Jeff Lee");
        person.setAge(20);
        person.setSex("boy");        
        //Person person2 = person; 引用相同 修改同時修改
        Person person2 = person.clone();//引用不一樣 內容相同 修改各自
        
         System.out.println(person2.getNanme());
        person2.setNanme("Jeff Lee 2");
        System.out.println(person2.getNanme());
        System.out.println(person.getNanme());
    }
}

複製代碼

淺度克隆沒法克隆對象裏面的引用。

 

深度克隆只須要將其引用重定義下便可:

複製代碼

@Override    protected Person clone() throws CloneNotSupportedException
    {
        Person person = (Person)super.clone();
        List<String> friends = new ArrayList<String>();        for (String friend : this.getFriends())
        {
            friends.add(friend);
        }
        person.setFriends(friends);        return person; 
    }

複製代碼

測試代碼:

複製代碼

import java.util.ArrayList;import java.util.List;public class MainClass
{    public static void main(String[] args) throws CloneNotSupportedException
    {

        Person person = new Person();
        List<String> friends = new ArrayList<String>();
        friends.add("Zhang San");
        friends.add("Li Si");
        person.setFriends(friends);
        
        Person person2 = person.clone();
        
        System.out.println(person.getFriends());
        System.out.println(person2.getFriends());
        
        friends.add("Wang Wu");
        person.setFriends(friends);
        
        System.out.println(person.getFriends());
        System.out.println(person2.getFriends());
    }
}

複製代碼

 

4、感謝知識來源和小結

來自:java設計模式

如以上文章或連接對你有幫助的話,別忘了在文章按鈕或到頁面右下角點擊 「贊一個」 按鈕哦。你也能夠點擊頁面右邊「分享」懸浮按鈕哦,讓更多的人閱讀這篇文章。

親有過 諫使更 怡吾色 柔吾聲 諫不入 悅復諫 號泣隨 撻無怨
相關文章
相關標籤/搜索