开发手册 欢迎您!
软件开发者资料库

.NET(C#) 设计模式 原型模式

设计模式(Design pattern)是代码设计经验的总结。设计模式主要分三个类型:创建型、结构型和行为型。创建型是对象实例化的模式,创建型模式用于解耦对象的实例化过程,主要用于创建对象。结构型是把类或对象结合在一起形成一个更大的结构,主要用于优化不同类、对象、接口之间的结构关系。行为型是类和对象如何交互,及划分责任和算法。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。本文主要介绍.NET(C#) 设计模式 原型模式。

原型模式(Prototype Pattern)

原型模式(Prototype Pattern)是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种创建型设计模式。也就是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。C# 提供了 ICloneable 接口,用 C# 实现原型模式很简单。

1)使用Object的MemberwiseClone() 方法

using System;
using System.Text;namespace ConsoleApplication{ public class WebSite { public string Name { get; set; } public string Url { get; set; } static WebSite webSite = new WebSite() { Name = "wonhero", Url = "https://www.wonhero.com" }; /// /// 原型模式:解决对象重复创建的问题 /// 通过MemberwiseClone来clone新对象,内存操作,直接复制的,避免重复创建 /// Object有 MemberwiseClone() 方法默认浅克隆 /// /// public static WebSite CreateInstancePrototype() { return (WebSite)webSite.MemberwiseClone(); } } class Program { static void Main(string[] args) { var obj=WebSite.CreateInstancePrototype(); Console.WriteLine("Name={0},Url={1}",obj.Name,obj.Url); Console.ReadKey(); } }}

2)使用ICloneable接口

using System;using System.Text;namespace ConsoleApplication{    public class WebSite : ICloneable    {        public string Name { get; set; }        public string Url { get; set; }        static WebSite webSite = new WebSite()        {            Name = "wonhero",            Url = "https://www.wonhero.com"        };        ///         /// 原型模式:解决对象重复创建的问题        /// 通过MemberwiseClone来clone新对象,内存操作,直接复制的,避免重复创建        ///         ///         public static WebSite CreateInstancePrototype()        {            return (WebSite)webSite.MemberwiseClone();        }        public object Clone()        {            return new WebSite() { Name = this.Name, Url = this.Url };        }    }    class Program    {        static void Main(string[] args)        {            var obj1 = new WebSite()            {                Name = "wonhero",                Url = "https://www.wonhero.com"            };            var obj2 = (WebSite)obj1.Clone();            Console.WriteLine("Name={0},Url={1}", obj2.Name, obj2.Url);            Console.ReadKey();        }    }}