C#设计模式(6)-原型模式
引言
上一篇介绍了设计模式中的抽象工厂模式-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 = ;
a.Display(); //浅复制
Pay b = (Pay)a.Clone();
b.Product = "台式机";
b.ConsumptionAmount = ;
b.Display(); Console.ReadKey();
}
}
}
运行结果
原型模式结构图
总结
优缺点
优点:原型模式向客户隐藏了创建新实例的细节,大大的提高了性能;初始化信息不发生变化的情况下,克隆是很好的办法;
缺点:每个类必须有一个克隆方法
C#设计模式(6)-原型模式的更多相关文章
- 设计模式_11_原型模式(prototype)深拷贝、浅拷贝
设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...
- C#设计模式(6)——原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- C#设计模式之六原型模式(Prototype)【创建型】
一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...
- C#设计模式之五原型模式(Prototype Pattern)【创建型】
一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...
- C#设计模式(6)——原型模式(Prototype Pattern)(转)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone
C#设计模式(6)——原型模式(Prototype Pattern) 一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...
- JAVA 设计模式之原型模式
目录 JAVA 设计模式之原型模式 简介 Java实现 1.浅拷贝 2.深拷贝 优缺点说明 1.优点 2.缺点 JAVA 设计模式之原型模式 简介 原型模式是六种创建型设计模式之一,主要应用于创建相同 ...
- C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone
C# Json反序列化 Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...
- GOF23设计模式之原型模式
GOF23设计模式之原型模式 1)通过 new 产生一个对象需要飞船繁琐的数据准备或访问权限,则可以使用原型模式. 2)就算 java 中的克隆技术,以某个对象为原型,复制出新的对象.显然,新的对象具 ...
随机推荐
- Linux命令的学习
mkdir -p 创建目录 (make directorys) p递归创建 ls -l(long)d(direcitory)显示目录或者文件 cd 切换目录 从"/"开始目录,/ ...
- Git的commit your changes or stash them before you can merge
今天用git pull来更新代码,遇到了下面的问题: error: Your local changes to the following files would be overwritten by ...
- 像Linux终端一样使用windows命令行【cmder】
像Linux终端一样使用windows命令行[cmder] 下载cmder 我下载的是full版,下载之后是个压缩包,解压之后点击cmder.exe即可运行. 需要解决的几个问题 默认的是λ,当然还是 ...
- Flow-Guided Feature Aggregation for Video Object Detection论文笔记
摘要 目前检测的准确率受物体视频中变化的影响,如运动模糊,镜头失焦等.现有工作是想要在框的级别上寻找时序信息,但这样的方法通常不能端到端训练.我们提出了flow-guided feature aggr ...
- Struts2学习笔记(十一)——文件上传
1.单文件上传 单文件上传步骤: 1)创建上传jsp页面 文件上传的表单提交方式必须是POST方式,编码类型:enctype="multipart/form-data",默认是 a ...
- 新瓶装旧酒:全程无命令 GitHub Pages 创建您的博客站点
使用 GitHub Pages 创建博客站点的文章很多,也有很长的历史了.但是,许多已经与当前的 GitHub 不一致了,如果你按图索骥,会发现驴唇对不上马嘴. 更为麻烦的是,你会发现或者需要你输入许 ...
- 【Linux】查看系统位数
1.getconf LONG_BIT 2.uname -m 3.arch 4.file /sbin/init 5.file /bin/ls
- 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二进制和源码安装
[MySQL]Linux下MySQL 5.5.5.6和5.7的RPM.二进制和源码安装 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后, ...
- Android笔记: 日期格式化
下面的转换符来自Java,但是在android中同样可用.(以下表格内容来自互联网.) 常见日期格式化转换符 转换符 说 明 示 例 %te 一个月中的某一天(1-31) 2 %tb 指定语言环 ...
- mvc中html导出成word下载-简单粗暴方式
由于工作需求,需要把html简历页导出成word下载.网上搜索了很多解决方案,基本都是用一些插件,然后写法也很麻烦,需要创建模板什么的. 固定替换值 代码一大堆.但是对于我的需求来说 并没有什么用 ...