1. 程式人生 > >C#設計模式:原型模式(Prototype Pattern)

C#設計模式:原型模式(Prototype Pattern)

設計 公司 ext spa type img 存在 變化 new

一,原型模式:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace _5.原型模式
{
    //原型模式:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。
    //它主要面對的問題是:“某些結構復雜的對象”的創建工作;由於需求的變化,這些對象經常面臨著劇烈的變化,但是他們卻擁有比較穩定一致的接口。
class Program { public static int MAX_COUNT = 100000; static void Main(string[] args) { //使用克隆程序執行時間 Stopwatch st = new Stopwatch(); st.Start(); Mail m = new Mail("xxx公司發送郵件"); for (int i = 0; i < MAX_COUNT; i++) { Mail m2
= m.Clone(); m2.Content = i + " 先生(女士) "; SendMail(m2); } st.Stop(); Console.WriteLine("使用克隆程序執行時間:" + st.Elapsed); //不使用克隆程序執行時間 Stopwatch st2 = new Stopwatch(); st2.Start(); for (int i = 0
; i < MAX_COUNT; i++) { Mail m3 = new Mail("xxx公司發送郵件"); m3.Content = i + " 先生(女士) "; SendMail(m3); } st2.Stop(); Console.WriteLine("不使用克隆程序執行時間:" + st2.Elapsed); Console.ReadKey(); } public static void SendMail(Mail m) { //Console.WriteLine(m.Title + m.Content); } } public class Mail { private string _title; public Mail(string title) { this._title = title; Add(); } public void Add() { for (int i = 0; i < 100; i++) { var a = i; } } public string Title { get { return _title; } } public string Content { get; set; } public Mail Clone() { return (Mail)this.MemberwiseClone(); } } }

二,執行結果

技術分享圖片

三,原型模式:“某些結構復雜的對象”的創建工作;由於需求的變化,這些對象經常面臨著劇烈的變化,但是他們卻擁有比較穩定一致的接口。

1》復雜對象的指的是當創建該對象消耗資源過多

2》面臨的劇烈變化,比如發郵件,我們需要發N條,但是這N條郵件的對象每個人發送的信息也不同,所以導致實力出的的對象的也不完全一樣

3》穩定的接口值得是都是通過同一個方法將該對象發送出去,既是調用方法一般不存在變化,而是對象改變

四,在什麽情況下該選擇原型模式?

1》是類初始化需要消化非常多的資源,這個資源包括數據、硬件資源等,如上結果所示,我們在初始化時消耗過多資源,這是就體現出原型模式的優勢

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

五,原型模式的淺度克隆和深度克隆是什麽意思?

1》淺度復制(Shallow Copy):將原來對象中的所有字段逐個復制到一個新對象,如果字段是值類型,則簡單地復制一個副本到新對象,改變新對象的值類型字段不會影響原對象;如果字段是引用類型,則復制的是引用,改變目標對象中引用類型字段的值將會影響原對象。

2》深度復制(Deep Copy):與淺復制不同之處在於對引用類型的處理,深復制將新對象中引用類型字段指向復制過的新對象,改變新對象中引用的任何對象,不會影響到原來的對象中對應字段的內容。

C#設計模式:原型模式(Prototype Pattern)