惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
F
Fortinet All Blogs
B
Blog
T
The Blog of Author Tim Ferriss
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
Y
Y Combinator Blog
Microsoft Azure Blog
Microsoft Azure Blog
L
LangChain Blog
Recent Announcements
Recent Announcements
U
Unit 42
Martin Fowler
Martin Fowler
M
MIT News - Artificial intelligence
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Register - Security
The Register - Security
Recorded Future
Recorded Future
C
Check Point Blog
V
V2EX
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
酷 壳 – CoolShell
酷 壳 – CoolShell
F
Full Disclosure
小众软件
小众软件
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
有赞技术团队
有赞技术团队
MongoDB | Blog
MongoDB | Blog
爱范儿
爱范儿
P
Proofpoint News Feed
罗磊的独立博客
量子位
D
Docker
博客园_首页
D
DataBreaches.Net
Project Zero
Project Zero
博客园 - 司徒正美
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - Franky
Security Latest
Security Latest
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
Netflix TechBlog - Medium
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
大猫的无限游戏
大猫的无限游戏

博客园 - Jingnan

微信支付开发 c# SDK JSAPI支付开发的流程和微信大坑 T4模板根据数据库表和列的Description生成代码的summary的终极解决方案 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程一 平台介绍 wcf几种调用方式的性能讨论 WCF同样功能不同写法的性能问题 ASP.NET 4.0 URL路由改进支持 WPF 用webBowser 嵌套 URL地址 显示ReportViewer导出EXCEL的一些问题 简单的封装一个HTML 弹出对话框的空间 恶性代码 - Jingnan - 博客园 AdvDataList分页 例码 问一个关于生成静态页面的问题 简单读区XML - Jingnan - 博客园 使用XMLDataSource简单实现多级下拉菜单 ASP.NET实现新闻页面的分页功能[生成静态版] 更新 增加 用Table形式
原型模式(Prototype)
Jingnan · 2010-05-23 · via 博客园 - Jingnan

本文参考:http://www.cnblogs.com/QinBaoBei/archive/2010/05/22/1741661.html

本文只做学习笔记

简单的浅

using System;
namespace XixaoNan.A
{
    
/// <summary>
    
/// 声明一个抽象类
    
/// </summary>
    public abstract class AbstractPrototype
    {
        
private string name;
        
public string Name
        {
            
get { return name; }
            
set { name = value; }
        }
public abstract AbstractPrototype Clone();
    }
public class CreateProtoTypeA : AbstractPrototype
    {
        
public CreateProtoTypeA(string name)
        {
            
this.Name = name;
        }
public override AbstractPrototype Clone()
        {
            
/* 摘自 MSDN: 
            MemberwiseClone 方法创建一个浅表副本 
            方法是创建一个新对象 
            然后将当前对象的非静态字段复制到该新对象 
            如果字段是值类型的 
            则对该字段执行逐位复制 
            如果字段是引用类型 
            则复制引用但不复制引用的对象 
            因此,原始对象及其复本引用同一对象。 
            例如,考虑一个名为 X 的对象, 
            该对象引用对象 A 和 B,对象 B 又引用对象 C 
            X 的浅表副本创建一个新对象 X2,该对象也引用对象 A 和 B 
            与此相对照,X 的深层副本创建一个新对象 X2, 
            该对象引用新对象 A2 和 B2,它们分别是 A 和 B 的副本 
            B2 又引用新对象 C2,C2 是 C 的副本 
            使用实现 ICloneable 接口的类执行对象的浅表或深层复制 
          
*/
            
return (AbstractPrototype)this.MemberwiseClone();

        }
    }

public class Client
    {
        
static void Main()
        {
            AbstractPrototype absA 
= new CreateProtoTypeA("A的名字");
            AbstractPrototype absB 
= absA.Clone();
            Console.WriteLine(
"A的名字是:"+absA.Name);
            Console.WriteLine(
"B的名字是:"+absB.Name);
            absB.Name 
= "B 新换的名字";
            Console.WriteLine(
"B的名字是:" + absB.Name);
            Console.ReadLine();
        }
    }
}

 深克隆方法

代码

using System; public class ConcreteProtoTypeA : ICloneable 
    { 
        
private string name; 
        
private Test test; public string Name 
        { 
            
get { return name; } 
            
set { name = value; } 
        } 
public ConcreteProtoTypeA(string name, Test test) 
        { 
            
this.Name = name; 
            
this.test = test; 
        } 
public Object Clone() 
        { 
            
//先同过现有的 Test 对象来克隆一个新的 Test 对象 
            Test myTest = (Test)this.test.Clone(); 
            
//然后通过这个新的 Test 对象来实例化一个新的 ConcreteProtoTypeA 对象 
            return new ConcreteProtoTypeA(this.name, myTest); 
        } 
public void SetTest(string test) 
        { 
            
this.test.TestName = test; 
        } 
public void DisplayTest() 
        { 
            Console.WriteLine(
this.test.TestName); 
        } 
    } 
 
 
public class Test : ICloneable 
    { 
        
private string testName; public string TestName 
        { 
            
get { return testName; } 
            
set { testName = value; } 
        } 
public Test(string name) 
        { 
            
this.TestName = name; 
        } 
/// <summary> 
        
/// 实现一个克隆 
        
/// </summary> 
        
/// <returns></returns> 
        public Object Clone() 
        { 
            
return (Object)this.MemberwiseClone(); 
        } 
    }
class Program 
    { 
        
static void Main(string[] args) 
        { 
            Test test 
= new Test("BaoBeiMe"); 
            
//首先是要实例化一个原型对象 
            ConcreteProtoTypeA prototypeA = new ConcreteProtoTypeA("A", test); 
            
//根据这个原型对象来克隆一个新的对象 
            ConcreteProtoTypeA prototypeB = (ConcreteProtoTypeA)prototypeA.Clone(); 

            prototypeA.DisplayTest(); 
            prototypeB.DisplayTest(); 

//修改新对象指向的引用对象 Test 
            prototypeB.SetTest("BoyXiao"); 
            Console.WriteLine(
"\n修改值后的结果:\n"); 
            prototypeA.DisplayTest(); 
            prototypeB.DisplayTest(); 

            Console.ReadKey(); 
        } 
    }