Summer SALE
原型

C# 原型模式讲解和代码示例

原型是一种创建型设计模式 使你能够复制对象 甚至是复杂对象 而又无需使代码依赖它们所属的类

所有的原型类都必须有一个通用的接口 使得即使在对象所属的具体类未知的情况下也能复制对象 原型对象可以生成自身的完整副本 因为相同类的对象可以相互访问对方的私有成员变量

复杂度

流行度

使用示例 C# 的 ICloneable  克隆 接口就是立即可用的原型模式

识别方法 原型可以简单地通过 clone copy等方法来识别

概念示例

本例说明了原型设计模式的结构并重点回答了下面的问题

  • 它由哪些类组成
  • 这些类扮演了哪些角色
  • 模式中的各个元素会以何种方式相互关联

Program.cs: 概念示例

using System; namespace RefactoringGuru.DesignPatterns.Prototype.Conceptual { public class Person { public int Age; public DateTime BirthDate; public string Name; public IdInfo IdInfo; public Person ShallowCopy() { return (Person) this.MemberwiseClone(); } public Person DeepCopy() { Person clone = (Person) this.MemberwiseClone(); clone.IdInfo = new IdInfo(IdInfo.IdNumber); clone.Name = String.Copy(Name); return clone; } } public class IdInfo { public int IdNumber; public IdInfo(int idNumber) { this.IdNumber = idNumber; } } class Program { static void Main(string[] args) { Person p1 = new Person(); p1.Age = 42; p1.BirthDate = Convert.ToDateTime("1977-01-01"); p1.Name = "Jack Daniels"; p1.IdInfo = new IdInfo(666); // Perform a shallow copy of p1 and assign it to p2. Person p2 = p1.ShallowCopy(); // Make a deep copy of p1 and assign it to p3. Person p3 = p1.DeepCopy(); // Display values of p1, p2 and p3. Console.WriteLine("Original values of p1, p2, p3:"); Console.WriteLine(" p1 instance values: "); DisplayValues(p1); Console.WriteLine(" p2 instance values:"); DisplayValues(p2); Console.WriteLine(" p3 instance values:"); DisplayValues(p3); // Change the value of p1 properties and display the values of p1, // p2 and p3. p1.Age = 32; p1.BirthDate = Convert.ToDateTime("1900-01-01"); p1.Name = "Frank"; p1.IdInfo.IdNumber = 7878; Console.WriteLine("\nValues of p1, p2 and p3 after changes to p1:"); Console.WriteLine(" p1 instance values: "); DisplayValues(p1); Console.WriteLine(" p2 instance values (reference values have changed):"); DisplayValues(p2); Console.WriteLine(" p3 instance values (everything was kept the same):"); DisplayValues(p3); } public static void DisplayValues(Person p) { Console.WriteLine(" Name: {0:s}, Age: {1:d}, BirthDate: {2:MM/dd/yy}", p.Name, p.Age, p.BirthDate); Console.WriteLine(" ID#: {0:d}", p.IdInfo.IdNumber); } } } 

Output.txt: 执行结果

Original values of p1, p2, p3: p1 instance values: Name: Jack Daniels, Age: 42, BirthDate: 01/01/77 ID#: 666 p2 instance values: Name: Jack Daniels, Age: 42, BirthDate: 01/01/77 ID#: 666 p3 instance values: Name: Jack Daniels, Age: 42, BirthDate: 01/01/77 ID#: 666 Values of p1, p2 and p3 after changes to p1: p1 instance values: Name: Frank, Age: 32, BirthDate: 01/01/00 ID#: 7878 p2 instance values (reference values have changed): Name: Jack Daniels, Age: 42, BirthDate: 01/01/77 ID#: 7878 p3 instance values (everything was kept the same): Name: Jack Daniels, Age: 42, BirthDate: 01/01/77 ID#: 666 

原型在其他编程语言中的实现

C++ 原型模式讲解和代码示例 Go 原型模式讲解和代码示例 Java 原型模式讲解和代码示例 PHP 原型模式讲解和代码示例 Python 原型模式讲解和代码示例 Ruby 原型模式讲解和代码示例 Rust 原型模式讲解和代码示例 Swift 原型模式讲解和代码示例 TypeScript 原型模式讲解和代码示例