当前位置: 首页 > news >正文

卓老师建站网站后台如何直接登陆铁岭网站建设公司

卓老师建站网站后台如何直接登陆,铁岭网站建设公司,wordpress gofair,搜索不到我的网站一、上篇回顾 上篇创建者模式中#xff0c;我们主要讲述了创建者的几类实现方案#xff0c;和创建者模式的应用的场景和特点#xff0c;创建者模式适合创建复杂的对象#xff0c;并且这些对象的每 个组成部分的详细创建步骤可以是动态的变化的#xff0c;但是每个对象的组…一、上篇回顾 上篇创建者模式中我们主要讲述了创建者的几类实现方案和创建者模式的应用的场景和特点创建者模式适合创建复杂的对象并且这些对象的每 个组成部分的详细创建步骤可以是动态的变化的但是每个对象的组装的过程来说可能是相对固定的或者说是对象的创建的过程是固定的那么通过创建者 模式可以很好的解决这类复杂对象的创建而在我们的生活中或者是项目中可能会有这个方面的需求那么使用创建者模式无疑是好的选择。 创建者模式中的每个对象组成部分的构建都是对象本身提供的内部方法具体的创建者只是调用要创建的对象的内部的相应组成部分的构建方法组 织这些对象内部构建方法的执行顺序完成对象的完整构建。当我们的客户应用程序需要调用这个创建者时我们只需要通过指导者调用的形式提供统一 的创建者访问入口通过构造函数注入或者配置文件的形式来完成创建者的注入。 二、摘要 本文主要是讲述创建型模式中一个比较特殊的模式-原型模式这个模式呢有个最大的特点是克隆一个现有的对象这个克隆的结果有2种一种是 是浅复制另一种是深复制这里我们也会探讨下深复制和浅复制的原理这样可能更方便大家理解这个原型模式的使用。我们都知道创建型模式一般是 用来创建一个新的对象然后我们使用这个对象完成一些对象的操作我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快 速完成对象的创建这无疑是一种非常有效的方式快速的创建一个新的对象。本文将会从以下几个方面进行讲述 1、原型模式的使用场景和特点 2、浅复制和深复制的原理。 3、举例说明浅复制和深复制。 4、原型模式的实现方案。 5、总结原型模式。 我们这里先给出一个原型模式的原理图 三、本文大纲 a、上篇回顾。 b、摘要。 c、本文大纲。 d、原型模式的特点及使用场景。 e、深复制和浅复制。 f、原型模式的实现方案。 g、原型模式使用总结。 h、系列进度。 i、下篇预告。 四、原型模式的特点及使用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来一般是有对象的内部提供克隆的方法通过该方法返回一个对象的副本这种创建对 象的方式相比我们之前说的几类创建型模式还是有区别的之前的讲述的工厂模式与抽象工厂都是通过工厂封装具体的new操作的过程返回一个新的对 象有的时候我们通过这样的创建工厂创建对象不值得特别是以下的几个场景的时候可能使用原型模式更简单也效率更高。 1、如果说我们的对象类型不是刚开始就能确定而是这个类型是在运行期确定的话那么我们通过这个类型的对象克隆出一个新的类型更容易。这个 怎么理解。例如我们有的时候在处理DataTable中的记录进行筛选后放在一个新的DataTable 中我们知道如果说2个dataTable的架构不同那么必须 手动的显示的赋值否则无法使用如下方式进行导入数据 下面给出测试的相关代码和说明 public class DataTableDemo { public void CloneTest() { string cmdText “SELECT * FROM TABLE”; DataTable dt new DataTable(); //通过执行上面的cmdText 返回一个dataTable对象 //这时候我们可以如下形式复制一个新的dataTable而不用先创建一个dataTable然后把每一列都显示的循环添加到新的dataTable中 //这是很大的工作量。 DataTable dt1 dt.Clone(); //克隆一个新的对象 dt1. #region 不采用克隆的形式复制一个新的dataTable DataTable dt2 new DataTable(); foreach (DataColumn column in dt.Columns) { dt2.Columns.Add(column.ColumnName); } #endregion } } 2、有的时候我们可能在实际的项目中需要一个对象在某个状态下的副本这个前提很重要这点怎么理解呢例如有的时候我们需要对比一个对象经 过处理后的状态和处理前的状态是否发生过改变可能我们就需要在执行某段处理之前克隆这个对象此时状态的副本然后等执行后的状态进行相应的对 比这样的应用在项目中也是经常会出现的。 假设我们有这样的需求我们在ORM框架的设计中经常会遇到这样的问题我们在处理某个对象的编辑状态的时候我们想框架给我们生成的更新 数据库的SQL语句不包含数据列没有发生变化的列不要出现在更新语句中这个时候可能一个方案会是编辑前克隆一个对象然后等编辑后提交 的时候生成相应的语句时进行对比之前克隆的对象看看是否数据发生变化如果说对象的部分数据列发生变化那么就只是把变化的数据列进行更新。 当然上面我只是给出了一种比较简单的但是效率不是很高的实现方案还有很多好的方案我就不讨论了这里只是为了说明原型模式的可用场景。 如果对上面的方式不是很理解或者看文字比较累的话可以看下面的图应该就比较清晰了。 这就是这种情况下可能原型模式有比较好的表现。 3、当我们在处理一些对象比较简单并且对象之间的区别很小可能只是很固定的几个属性不同的时候可能我们使用原型模式更合适例如我们生 活中的彩虹的七彩的颜色等等我们只需要根据现有的一个颜色对象克隆一个新的颜色对象然后修改具体的颜色的值就可以满足要求然后如果通过 我们之前讲述的创建型工厂抽象工厂模式等相对来说就引入新的依赖并且复杂度也有所提高。例如我们的生活中的颜色的克隆 我们都可以通过红色来克隆其他的所有颜色只是修改相应的个别属性即可远比创建一个新的对 象然后给对象的各个属性赋值来的简单和方便当然有的时候如果我们并不需要基于现有的对象复制新的对象或者我们需要的就是一个干净的空对 象那么我的首先还是工厂模式或者抽象工厂模式啦。 五、深复制和浅复制 既然我们本篇讲述了原型模式的具体应用那么我们就必须先搞清楚深复制和浅复制否则也没有办清楚原型模式中的具体的克隆过程和克隆出来的 对象的详细情况。 .NET Freamwork 内置的每个继承自System.Object都有保护成员方法 // // 摘要: // 创建当前 System.Object 的浅表副本。 // // 返回结果: // 当前 System.Object 的浅表副本。 [SecuritySafeCritical] protected object MemberwiseClone(); 系统为我们内置提供了复制对象本身的方法不过这个方法返回的是一个浅复制的对象副本而且.NET给我提供了一个System.ICloneable的接口 我们通过实现这个接口可以为对象提供自定义的克隆方法。 为了搞明白浅复制和深复制那么我先要搞懂这2者的区别.NET本身提供了浅复制的方法而深复制的方法需要自己实现接口来完成。 我们先来看看浅复制后的对象和对象副本的情况 我们再看看看深复制的对象和对象副本的情况 通过上面的描述大家应该针对浅复制和深复制的区别有了大概的了解那么我们再结合程序代码来分 析吧可能大家会更熟悉具体的应用。我们先来看看最简单的浅复制和深复制情况我们这里举例来说吧 我们定义一个杯子类并且简单定义杯子的几项简单的属性具体代码如下 /// /// 杯子类 /// public class Cup : ICloneable { private double _rl; private int _height; private Factory _factory; /// /// 高度 /// public int Height { get { return _height; } set { _height value; } } /// /// 容量 /// public double RL { get { return _rl; } set { _rl value; } } /// /// 生产厂家 /// public Factory Factory { get { return _factory; } set { _factory value; } } #region ICloneable 成员 public object Clone() { return this.MemberwiseClone(); } #endregion } 具体的测试代码 class Program { static void Main(string[] args) { Cup cup new Cup(); cup.Height 2; Cup cup1 (Cup)cup.Clone(); cup1.Height 1; Console.WriteLine(cup.Height cup1.Height); System.Threading.Thread.Sleep(10000); } } 运行结果如下 综上所述我们知道对于值类型的成员浅复制也是在副本中重新创建的成员对应到内存的栈上分配新的内存空间。那么对于引用类型则因为浅复制 的时候对象和对象副本共用同一个引用对象那么不管是在对象还是对象副本中修改了相应的引用成员了之后那么这个引用类型的成员就会发生变化。 因为2个对象指向同一个内存地址那么任何一个修改操作都会产生改变。 那么对于上面的这个类如何修改这个类的实现才能实现深复制呢 将上面的Clone方法如下实现 public object Clone() { Cup cup (Cup)this.MemberwiseClone(); Factory factory1 new Factory(); factory1.FactoryName this.Factory.FactoryName; cup.Factory factory1; return cup; } 这样就完成了对象的深复制不管是值类型的成员还是引用类型的成员这样的对象和对象副本对任何一个成员属性的修改都不会影响到改变对象的 值。 六、原型模式的实现方案 6.1 原型模式的经典实现 我们先来看看原型模式的经典实现我们这里已颜色为例来说名下经典实现吧 定义一个接口 用来表述所有的颜色对象接口 public interface IColorDemo { IColorDemo Clone(); int Red { get; set; } int Green { get; set; } int Blue { get; set; } } 我们这里给出红色的具体实现代码 public class RedColor : IColorDemo { private int red; private int green; private int blue; public int Red { get { return this.red; } set { this.red value; } } public int Green { get { return this.green; } set { this.green value; } } public int Blue { get { return this.blue; } set { this.blue value; } } #region IColorDemo 成员 public IColorDemo Clone() { return (IColorDemo)this.MemberwiseClone(); } #endregion } 因为上面的对于颜色都是通过RGB不同的比例配置出来的所以我就定义了3个整形的变量所以我这里只是演示说明。那么具体的测试代码如下 static void Main(string[] args) { IColorDemo color new RedColor(); color.Red 255; IColorDemo color1 color.Clone(); color1.Blue 255; Console.WriteLine(color.Blue color1.Blue); System.Threading.Thread.Sleep(10000); } 返回的结果为false。代表对象副本的修改不会影响对象本身的状态。 6.2、原型模式的其他情况 上面讲述了简单的浅复制的情况那么我们来分析下深复制原型的实现吧深复制可能考虑的情况相对来说就会比较复杂因为有可能对象是之间 有继承关系或者引用关系的时候可能我们深复制的时候就需要注意当然这对我们也是个考验。一般来说深复制一方面可以采用上面我给出的那种简单的 深复制对象的时候的方案还可以通过序列化的形式来进行对象的复制。下面我们来通过序列化的形式来实现原型模式吧 我们先给出序列化和反序列化的帮助类 例如我们通过二进制的形式来进行序列化我们都知道可以序列化的类必须打上标记标识是否可以序列化也可以在成员属性上定义。 /// /// 序列化和反序列化辅助类 /// public class SerializableHelper { public string Serializable(object target) { using (MemoryStream stream new MemoryStream()) { new BinaryFormatter().Serialize(stream, target); return Convert.ToBase64String(stream.ToArray()); } } public object Derializable(string target) { byte[] targetArray Convert.FromBase64String(target); using (MemoryStream stream new MemoryStream(targetArray)) { return new BinaryFormatter().Deserialize(stream); } } public T Derializable(string target) { return (T)Derializable(target); } } 下面给出简单的示例代码还是使用上面的颜色对象为例。我们修改颜色类中的Clone方法 #region IColorDemo 成员 public IColorDemo Clone() { string target SerializableHelper.Serializable(this); return SerializableHelper.Derializable(target); } #endregion 程序的测试代码如下 static void Main(string[] args) { IColorDemo color new RedColor(); color.Red 255; IColorDemo color1 color.Clone(); color1.Red 234; Console.WriteLine(color.Blue color1.Blue); System.Threading.Thread.Sleep(10000); } 程序的运行结果为false肯定二个对象是不同的通过序列化和反序列化形成新的对象。其实只要是项目中要使用原型模式进行对象复制的情况 下都可以通过序列化的形式来进行深复制。 七、原型模式使用总结 原型模式作为创建型模式中的最特殊的一个模式具体的创建过程是由对象本身提供这样我们在很多的场景下我们可以很方便的快速的构建新 的对象就像前面分析讲解的几类场景中可能我们通过使用对象的克隆比通过其他几类的创建型模式效果要好的多而且代价也小很多。打个比方 原型模式对于系统的扩展可以做到无缝的扩展为什么这么说呢比如其他的创建型工厂如果新增一个对象类型那么我们不管是修改配置文件的方 式还是修改代码的形式无疑我们都是需要进行修改的对于我们大家通用的公共应用来说这无疑是危险的那么通过原型模式则可以解决这样的问 题因为类型本身实现这样的方法即可但是也有一定的缺点每个对象都实现这样的方法无疑是很大的工作量但是在某些特殊的环境下或者实际的 项目中可能原型模式是好的选择。 八、系列进度 创建型 1、系统架构技能之设计模式-单件模式 2、系统架构技能之设计模式-工厂模式 3、系统架构技能之设计模式-抽象工厂模式 4、系统架构技能之设计模式-创建者模式 5、系统架构技能之设计模式-原型模式 结构型 1、系统架构技能之设计模式-组合模式 2、系统架构技能之设计模式-外观模式 3、系统架构技能之设计模式-适配器模式 4、系统架构技能之设计模式-桥模式 5、系统架构技能之设计模式-装饰模式 6、系统架构技能之设计模式-享元模式 7、系统架构技能之设计模式-代理模式 行为型 1、系统架构技能之设计模式-命令模式 2、系统架构技能之设计模式-观察者模式 3、系统架构技能之设计模式-策略模式 4、系统架构技能之设计模式-职责模式 5、系统架构技能之设计模式-模板模式 6、系统架构技能之设计模式-中介者模式 7、系统架构技能之设计模式-解释器模式 九、下篇预告 下篇将会针对外观模式进行讲述该模式也是结构型模式中很有特点设计模式之一该 模式是将现有系统中的一些细粒度的东西通过外观对象包装起来 在应用程序中访问这些方法的时候通过外观类的形式提供统一的访问入口并且具体的细节应用程序并不需要知道这样就会降低程序调用的复杂 性由于本人水平有限不足或者有错误的地方请大家批评指正请大家继续支持我谢谢。 十、Demo下载 下载本文Demo 转自https://www.cnblogs.com/hegezhou_hot/archive/2010/12/04/1896471.html
http://www.hkea.cn/news/14356587/

相关文章:

  • 上海seo网站推广公司大数据营销软件
  • 织梦cms怎么做网站地图网络营销站点推广的方法
  • 上海优化网站 优帮云wordpress学院
  • 如何做一张图片的网站wordpress 调用了幻灯片但是显示为空白
  • 建设营销型网站服务外贸大楼
  • 网站顶部广告图片业务网站制作
  • 东莞建站模板公司物流网站建设策划书
  • html5手机网站制作教程线上推广的公司
  • 一家专门做原型的网站邯郸网站建设服务报价
  • 上海网站建设系wordpress魔板
  • 长沙市住房和建设局官方网站家居网站建设的需求分析
  • 最牛的科技网站建设帝国cms 做的博客网站
  • 融资网站建设重点抖音关键词优化排名
  • 网站设计素材下载网站建设都需要什么资料
  • 常州新北建设局网站做落地页素材在什么网站上找
  • 广州快速建站公司推荐东莞网站开发哪家强
  • 无锡网站的优化哪家好16素材网
  • 临沭县建设局官方网站磐安做网站
  • 网站备案更改吗荆楚网微信公众平台下载
  • 昆明网站建设哪家公司好企业网站优化怎么做
  • 长沙营销型网站建设公司网站设置主网
  • 药品网站如何建设工信部备案查询网站
  • 柳州网站建设22如何 在网站上面做推广
  • .design 域名的网站建设网站要做的工作总结
  • 网站增值服务网站设计说明书主要有什么
  • 网站开发的开题报告引言安装完wordpress怎么打开
  • 泉州模板网站建站wordpress 文章列表目录颜色
  • 登录官方网站帮人做钓鱼网站的人
  • 恶意网站的防治2017商会网站建设方案
  • 新绛做网站南昌seo搜索优化