首页 技术 正文
技术 2022年11月9日
0 收藏 704 点赞 4,881 浏览 1601 个字

引言

上一篇介绍了设计模式中的抽象工厂模式-C#设计模式(3)-建造者模式,本篇将介绍原型模式;

点击这里查看全部设计模式系列文章导航

原型模式简介

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;

原型模式属于创建型模式,原型模式最大的特点就是对一个基类对象进行克隆复制创建出模型一样的副本,进行操作;

实例场景

这里我们模拟一个场景进行实例讲解;我(yxtic)需要去电脑城指定采购商(A公司)采购一台台式机、一台笔记本、一个平板等很多产品,然后需要分别结算付款;付款信息包含付款人、收款人、产品、价格;如果分别付款就需要实例化多个类,每个类都需要将付款人、收款人、产品、价格等信息输入,这里我们就可以使用原型模式,对于付款人、收款人信息是固定的,只需要修改产品和价格即可;详细请看如下实例代码;

实例代码

类图

C#设计模式(6)-原型模式

原型创建

注意.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 = ;
a.Display(); //浅复制
Pay b = (Pay)a.Clone();
b.Product = "台式机";
b.ConsumptionAmount = ;
b.Display(); Console.ReadKey();
}
}
}

运行结果

C#设计模式(6)-原型模式

原型模式结构图

C#设计模式(6)-原型模式

总结

优缺点

优点:原型模式向客户隐藏了创建新实例的细节,大大的提高了性能;初始化信息不发生变化的情况下,克隆是很好的办法;

缺点:每个类必须有一个克隆方法

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,078
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,553
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,402
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,177
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,814
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898