引言

上一篇介绍了设计模式中的抽象工厂模式-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)-原型模式的更多相关文章

  1. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  2. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  3. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  4. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  5. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  6. C#设计模式(6)——原型模式(Prototype Pattern)(转)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  7. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  8. JAVA 设计模式之原型模式

    目录 JAVA 设计模式之原型模式 简介 Java实现 1.浅拷贝 2.深拷贝 优缺点说明 1.优点 2.缺点 JAVA 设计模式之原型模式 简介 原型模式是六种创建型设计模式之一,主要应用于创建相同 ...

  9. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  10. GOF23设计模式之原型模式

    GOF23设计模式之原型模式 1)通过 new 产生一个对象需要飞船繁琐的数据准备或访问权限,则可以使用原型模式. 2)就算 java 中的克隆技术,以某个对象为原型,复制出新的对象.显然,新的对象具 ...

随机推荐

  1. 基于FPGA的RGB565_YCbCr_Gray算法实现

    前面我们讲了基于FPGA用VGA显示一副静态图片,那么接下来我们就接着前面的工程来实现我们图像处理的基础算法里最简单的一个那就是彩色图像转灰度的实现. 将彩色图像转化为灰度的方法有两种,一个是令RGB ...

  2. MFC加载PNG图片并实现双缓冲

    因为PNG包含Alpha通道,所以不同于BITMAP,在MFC中使用CImage类对其进行处理,通常使用load和draw成员函数. 所以标题的论述可以进一步解释为,使用CImage实现双缓冲. 通常 ...

  3. java之生成可重复执行的sql脚本

    在实际项目开发过程中,sql脚本需要多次执行.而一般的DML和DDL语句一般只能执行一次,再次执行执行时就会报错(操作对应已存在/不存在),所以必须将sql脚本生成可重复执行的.本文共分为4部分:1. ...

  4. 如何正确地修改.data和.item文件的‘utf-8’格式

    问题:有时候,我们在做分类信息提取的时候文件的格式可能不是我们想要的.txt文件的格式,如何进行修改? 解决:(1)将文件复制一份,并保存为.txt的格式(2)将复制之后的文件通过另存为的方式更改为u ...

  5. STL sort函数的用法

    sort在STL库中是排序函数,有时冒泡.选择等O(N^2)算法会超时时,我们可以使用STL中的快速排序O(N log N)完成排序 sort在<algorithm>库里面,原型如下: t ...

  6. noip2016普及组 题解

    T1 大水题,不解释 上考场代码 #include <algorithm> #include <cstdio> using namespace std; int main() ...

  7. ionic项目上划刷新和下拉刷新

    我们想要一块区域实现上划刷新时. 首先需要一块滚动视图:ionCintent 或者 ionScroll 把ion-infinite-scroll当作滚动视图的最后一个子元素,他的on-infinite ...

  8. Eclipse 安装插件(aptana、svn 、git、Java EE、JSHint)

    转发9 1.安装 aptana 插件:  * 依次点击:Help -> Install New Software... -> Add  * 输入:http://download.aptan ...

  9. windows下tomcat zip解压版安装方法

    下面记录一下在win7(32位)系统下,安装zip解压版的方法: 一.下载zip压缩包 地址:http://tomcat.apache.org/download-80.cgi 二.解压 我把解压包解压 ...

  10. windows转储文件(dmp)

    1. 何为转储文件      转储文件也就是我们常说的dump文件.可以把转储文件看成软件的某个时刻的一个快照.转储文件一般都是在软件出现问题时手动生成或者程序自动生成.下面我们介绍几种生成转储文件的 ...