设计模式之原型模式

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

.NET在System命名空间中提供了ICloneable接口,其中就是唯一的一个方法Clone(),这样你就只需要实现这个接口就可以完成原型模式。(选至《大话设计模式》)

MemberwiseClone()方法,如果字段是值类型的,则对该字段执行逐位复制,如果是应用类型,则复制引用但不复制引用对象;因此,原始对象及其复本应用同一对象。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 原型模式
{
    class C:ICloneable
    {
        private string address;
        public string Address
        {
            get
            {
                return address;
            }
            set
            {
                address = value;
            }
        }
        public object Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }
    class A : ICloneable
    {
        private string name;
        private string sex;
        public C c = new C();
        public void SexC(C Sc)
        {
            this.c = (C)Sc.Clone();
        }
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        public string Sex
        {
            get
            {
                return sex;
            }
            set
            {
                sex = value;
            }
        }
        public A(string Sname, string Ssex)
        {
            this.name = Sname;
            this.sex = Ssex;
        }
        public void show()
        {
            Console.WriteLine("姓名为:{0}", name);
            Console.WriteLine("性别为:{0}", sex);
            Console.WriteLine("工作地点:{0}", c.Address);
        }
        public object Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            C c = new C();
            c.Address = "湖北";
            A a = new A("张杨", "");
            a.SexC(c);
            c.Address = "深圳";
            A a1 = (A)a.Clone();
            a1.SexC(c);
            a.show();
            a1.show();
            Console.ReadKey();
        }
    }
}
复制代码

 

posted @   张杨  阅读(301)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示