最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Java設計模式之原型模式

 更新時間:2021年11月07日 15:04:29   作者:一指流砂~  
這篇文章主要介紹了JAVA設計模式之原型模式的的相關資料,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下

一、前言

單例模式可以避免重復創(chuàng)建消耗資源的對象,但是卻不得不共用對象。若是對象本身也不讓隨意訪問修改時,怎么辦?通常做法是備份到副本,其它對象操作副本,最后獲取權限合并,類似git上的PR操作。

二、什么是原型模式

原型模式用原型實例指定創(chuàng)建對象的種類,并通過拷貝這些原型創(chuàng)建新的對象。需要注意的關鍵字是,新的對象,類沒變。.NET在System命名空間中提供了Cloneable接口,其中它提供唯一的方法Clone(),只需要實現(xiàn)這個接口就可以完成原型模式了。由于它直接操作內存中的二進制流,當大量操作或操作復雜對象時,性能優(yōu)勢將會很明顯。

三、原型模式的適用場景

多用于創(chuàng)建大對象,或初始化繁瑣的對象。如游戲中的背景,地圖。web中的畫布等等

以下場景適用:

一是類初始化需要消化非常多的資源,這個資源包括數(shù)據(jù)、硬件資源等;

二是通過 new 產生一個對象需要非常繁瑣的數(shù)據(jù)準備或訪問權限,則可以使用原型模式;

三是一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時,可以考慮使用原型模式拷貝多個對象供調用者使用。

在實際項目中,原型模式很少單獨出現(xiàn),一般是和工廠方法模式一起出現(xiàn),通過 clone的方法創(chuàng)建一個對象,然后由工廠方法提供給調用者。

四、原型模式的實現(xiàn)

以簡歷的復印來舉例

1.淺拷貝實現(xiàn)

定義工作經歷類

/// <summary>
/// 工作經歷類
/// </summary>
public class WorkExperience
{
    private string _workDate;
    public string WorkDate
    {
        get { return _workDate; }
        set { _workDate = value; }
    }
     private string _company;
    public string Company
    {
        get { return _company; }
        set { _company = value; }
    }
}

定義簡歷類

/// <summary>
/// 簡歷類
/// </summary>
class Resume : ICloneable
{
    private string name;
    private string sex;
    private string age;
     private WorkExperience work;
     public Resume(string name)
    {
        this.name = name;
        work = new WorkExperience();
    }
     /// <summary>
    /// 設置個人信息
    /// </summary>
    /// <param name="sex"></param>
    /// <param name="age"></param>
    public void SetPersonalInfo(string sex, string age)
    {
        this.sex = sex;
        this.age = age;
    }
     /// <summary>
    /// 設置工作經歷
    /// </summary>
    /// <param name="workDate"></param>
    /// <param name="company"></param>
    public void SetWorkExperience(string workDate, string company)
    {
        work.WorkDate = workDate;
        work.Company = company;
    }
     /// <summary>
    /// 顯示
    /// </summary>
    public void Display()
    {
        Console.WriteLine("{0}{1}{2}", name, sex, age);
        Console.WriteLine("工作經歷:{0}{1}", work.WorkDate, work.Company);
    }
     public object Clone()
    {
        //創(chuàng)建當前object的淺表副本
        return (object)this.MemberwiseClone();
    }
}

客戶端調用

static void Main(string[] args)
{
    Resume a = new Resume("張三");
    a.SetPersonalInfo("男", "30");
    a.SetWorkExperience("2010-2018", "騰訊公司");
     Resume b = (Resume)a.Clone();
    b.SetWorkExperience("2010-2015", "阿里公司");
     Resume c = (Resume)a.Clone();
    c.SetPersonalInfo("女", "18");  c.SetWorkExperience("2010-2015", "百度公司");
     a.Display();
    b.Display();
    c.Display();
     Console.Read();
}

結果

張三 男 30
工作經歷 2010-2018 騰訊公司
張三 男 30
工作經歷 2010-2018 騰訊公司
張三 女 18
工作經歷 2010-2018 騰訊公司

被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象,這就是淺復制。但是我們可能需要這樣一種需求,要把復制的對象所引用的對象都復制一遍。比如剛才的例子,我希望a、b、c三個引用的對象都是不同的。復制時就一變二,二變三。此時,我們就要用的方式叫“深復制”

2.深拷貝實現(xiàn)

深復制把引用對象的變量指向復制過的新對象,而不是原來被引用的對象

/// <summary>
/// 工作經歷類
/// </summary>
public class WorkExperience:ICloneable
{
    private string _workDate;
    public string WorkDate
    {
        get { return _workDate; }
        set { _workDate = value; }
    }
     private string _company;
    public string Company
    {
        get { return _company; }
        set { _company = value; }
    }
     public object Clone()
    {
        //創(chuàng)建當前object的淺表副本
        return (object)this.MemberwiseClone();
    }
}
/// <summary>
/// 簡歷類
/// </summary>
class Resume : ICloneable
{
    private string name;
    private string sex;
    private string age;
     private WorkExperience work;
     public Resume(string name)
    {
        this.name = name;
        work = new WorkExperience();
    }
     private Resume(WorkExperience work)
    {
        //提供Clone方法調用的私有構造函數(shù),以便克隆“工作經歷”數(shù)據(jù)
        this.work = (WorkExperience)work.Clone();
    }
     /// <summary>
    /// 設置個人信息
    /// </summary>
    /// <param name="sex"></param>
    /// <param name="age"></param>
    public void SetPersonalInfo(string sex, string age)
    {
        this.sex = sex;
        this.age = age;
    }
     /// <summary>
    /// 設置工作經歷
    /// </summary>
    /// <param name="workDate"></param>
    /// <param name="company"></param>
    public void SetWorkExperience(string workDate, string company)
    {
        work.WorkDate = workDate;
        work.Company = company;
    }
     /// <summary>
    /// 顯示
    /// </summary>
    public void Display()
    {
        Console.WriteLine("{0}{1}{2}", name, sex, age);
        Console.WriteLine("工作經歷:{0}{1}", work.WorkDate, work.Company);
    }
     public object Clone()
    {
        //調用私有的構造方法,讓“工作經歷”克隆完成,然后再給這個簡歷對象的相關字段賦值,
        //最終返回一個深復制的簡歷對象
        Resume obj = new Resume(this.work);
        obj.name = this.name;
        obj.sex = this.sex;
        obj.age = this.age;
        return obj;
    }
}

客戶端調用代碼一樣

結果

張三 男 30
工作經歷 2010-2018 騰訊公司
張三 男 30
工作經歷 2010-2015 阿里公司
張三 女 18
工作經歷 2010-2015 百度公司

由于在一些特定場合,會經常涉及深復制和淺復制,比如說,數(shù)據(jù)集對象DataSet,它就有Clone()方法和Copy()方法,Clone()方法用來復制DataSet的結構,但不復制DataSet的數(shù)據(jù),實現(xiàn)了原型模式的淺復制,

Copy()方法不但復制結構,還復制數(shù)據(jù),其實就是實現(xiàn)了原型模式的深復制。

五、總結

原型模式通過Object的clone()方法實現(xiàn),由于是內存操作,無視構造方法和訪問權限,直接獲取新的對象。但對于引用類型,需使用深拷貝,其它淺拷貝即可。

相關文章

  • Java JVM編譯策略案例詳解

    Java JVM編譯策略案例詳解

    這篇文章主要介紹了Java JVM編譯策略案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • 詳解SpringBoot項目整合Vue做一個完整的用戶注冊功能

    詳解SpringBoot項目整合Vue做一個完整的用戶注冊功能

    本文主要介紹了SpringBoot項目整合Vue做一個完整的用戶注冊功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • java如何獲取指定文件夾下的所有文件名

    java如何獲取指定文件夾下的所有文件名

    這篇文章主要介紹了java如何獲取指定文件夾下的所有文件名問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 使用Spring靜態(tài)注入實現(xiàn)讀取配置工具類新方式

    使用Spring靜態(tài)注入實現(xiàn)讀取配置工具類新方式

    這篇文章主要介紹了使用Spring靜態(tài)注入實現(xiàn)讀取配置工具類新方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 圖解Java經典算法歸并排序的原理與實現(xiàn)

    圖解Java經典算法歸并排序的原理與實現(xiàn)

    歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide?and?Conquer)的一個非常典型的應用。本文將通過動圖詳解歸并排序的原理及實現(xiàn),需要的可以參考一下
    2022-09-09
  • Sharding-Jdbc如何配置主從讀寫分離模式

    Sharding-Jdbc如何配置主從讀寫分離模式

    文章介紹了如何使用Sharding-JDBC實現(xiàn)MySQL的讀寫分離,通過配置主從數(shù)據(jù)源和讀寫分離策略,可以在項目中實現(xiàn)高效的數(shù)據(jù)庫讀寫操作,同時,文章還提到解決MySQL連接異常的一個常見方法
    2025-03-03
  • SpringBoot中MVC的自動配置詳解

    SpringBoot中MVC的自動配置詳解

    這篇文章主要介紹了SpringBoot中MVC的自動配置詳解,在實際開發(fā)過程中,還有一些老的系統(tǒng)在使用xml格式來傳輸數(shù)據(jù),SpringBoot也提供了xml格式數(shù)據(jù)的返回,只需要小小的改動,就可以實現(xiàn),需要的朋友可以參考下
    2023-09-09
  • Java聊天室之使用Socket實現(xiàn)通信功能

    Java聊天室之使用Socket實現(xiàn)通信功能

    這篇文章主要為大家詳細介紹了Java簡易聊天室之使用Socket實現(xiàn)通信功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下
    2022-10-10
  • MyBatis Oracle 自增序列的實現(xiàn)方法

    MyBatis Oracle 自增序列的實現(xiàn)方法

    這篇文章給大家分享MyBatis Oracle 自增序列的實現(xiàn)方法及mybatis配置oracle的主鍵自增長的方法,非常不錯具有一定的參考借鑒價值,感興趣的朋友一起看看吧
    2016-11-11
  • springboot項目不輸出nohup.out日志的解決

    springboot項目不輸出nohup.out日志的解決

    這篇文章主要介紹了springboot項目不輸出nohup.out日志的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

张北县| 镶黄旗| 江达县| 松原市| 灌南县| 万安县| 稷山县| 同仁县| 抚宁县| 桂林市| 廉江市| 伊春市| 韩城市| 长汀县| 军事| 玉林市| 虹口区| 贵南县| 莱阳市| 尉犁县| 六枝特区| 思茅市| 新巴尔虎左旗| 台南县| 石狮市| 彝良县| 左云县| 博爱县| 吉林省| 新疆| 洛宁县| 阳泉市| 岳西县| 娱乐| 宜兴市| 沂水县| 沙雅县| 临泉县| 天峨县| 夹江县| 新平|