引言
上一篇介绍了设计模式中的抽象工厂模式-C#设计模式(3)-建造者模式,本篇将介绍原型模式;
原型模式简介
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;
原型模式属于创建型模式,原型模式最大的特点就是对一个基类对象进行克隆复制创建出模型一样的副本,进行操作;
实例场景
这里我们模拟一个场景进行实例讲解;我(yxtic)需要去电脑城指定采购商(A公司)采购一台台式机、一台笔记本、一个平板等很多产品,然后需要分别结算付款;付款信息包含付款人、收款人、产品、价格;如果分别付款就需要实例化多个类,每个类都需要将付款人、收款人、产品、价格等信息输入,这里我们就可以使用原型模式,对于付款人、收款人信息是固定的,只需要修改产品和价格即可;详细请看如下实例代码;
实例代码
类图
原型创建
注意.NET中带了ICloneable,这个接口就是原型,提供克隆方法;
创建Pay付款类实现了ICloneable中的Clone()方法来实现原型模式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PrototypePattern { public class Pay : ICloneable { /// <summary> /// 付款人 /// </summary> public string Payer { get; set; } /// <summary> /// 收款人 /// </summary> public string CollectionPeople { get; set; } /// <summary> /// 消费产品 /// </summary> public string Product { get; set; } /// <summary> /// 消费金额 /// </summary> public decimal ConsumptionAmount { get; set; } public void Display() { Console.WriteLine("付款人:{0} 收款人:{1} 消费产品:{2} 共消费:{3}元",this.Payer,this.CollectionPeople,this.Product,this.ConsumptionAmount); } /// <summary> /// 克隆 /// </summary> /// <returns></returns> public Object Clone() { return (object)this.MemberwiseClone(); } } }
客户端调用
b直接赋值a,这里就不用再次指定付款人和收款人了;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PrototypePattern { class Program { static void Main(string[] args) { Pay a = new Pay(); a.Payer = "yxtic"; a.CollectionPeople = "A公司"; a.Product = "平板"; a.ConsumptionAmount = 3000; a.Display(); //浅复制 Pay b = (Pay)a.Clone(); b.Product = "台式机"; b.ConsumptionAmount = 4000; b.Display(); Console.ReadKey(); } } }
运行结果
原型模式结构图
总结
优缺点
优点:原型模式向客户隐藏了创建新实例的细节,大大的提高了性能;初始化信息不发生变化的情况下,克隆是很好的办法;
缺点:每个类必须有一个克隆方法