zoukankan      html  css  js  c++  java
  • 原型模式(Prototype)

    本文参考: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(); 
            } 
        } 
     
  • 相关阅读:
    Android的FileOutputStream中向文本文件中写入换行符
    简单又好看的按钮,扁平化按钮。
    android常见错误之 No resource found that matches the given name
    eclipse中Android模拟器,DDMS看不到设备
    Android软件开发之盘点所有Dialog对话框大合集
    Android软件开发之TextView详解
    frameset网页彻底退出或跳转(转)
    .Net 如何限制用户登录(转)
    将上传图片文件转成二进制流再存储
    数据库链接字符串自动生成
  • 原文地址:https://www.cnblogs.com/sujingnan/p/1741871.html
Copyright © 2011-2022 走看看