发布网友 发布时间:2022-04-24 09:01
共2个回答
懂视网 时间:2022-05-19 14:57
原型模式的定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式结构图:
创建型模式中一个比较特殊的模式-原型模式,有个最大的特点是克隆一个现有的对象,这个克隆的结果有2种,一种是浅度复制,另一种是深度复制。
创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。
1.原型模式:浅度复制
定义一个接口, 用来表述所有的颜色对象接口
/// <summary> /// 颜色接口 /// </summary> public interface IColor { IColor Clone(); int Red { get; set; } int Green { get; set; } int Blue { get; set; } }
给出红色的具体实现代码:
public class RedColor:IColor { public int Red { get; set; } public int Green { get; set; } public int Blue { get; set; } public IColor Clone() { return (IColor)this.MemberwiseClone(); } }
具体的测试代码如下:
static void Main(string[] args) { IColor color = new RedColor(); color.Red = 255; Console.WriteLine("color -red " + color.Red); //225 IColor color1 = color.Clone(); color1.Red = 224; Console.WriteLine("color1-red " + color1.Red);//224 Console.WriteLine("color -red " + color.Red); //225 }
可以发现:在我们修改color1对象的Red属性值,没有对color的属性参生影响,即对象副本的修改不会影响对象本身的状态。
2.原型模式:深度复制
深复制考虑的情况相对来说就会比较复杂,因为有可能对象是之间有继承关系或者引用关系的时候,可能我们深复制的时候就需要注意.一般来说深复制一方面可以采用种简单的深复制对象的时候的方案,还可以通过序列化的形式来进行对象的复制。下面通过序列化的形式来实现原型模式:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication4 { /// <summary> /// 颜色接口 /// </summary> public interface IColor { IColorDemo Clone(); int Red { get; set; } int Green { get; set; } int Blue { get; set; } Factroy f{get;set;} } /// <summary> /// 生产颜色的工厂信息 /// </summary> [Serializable] public class Factroy { public string name { get; set; } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication4 { /// <summary> /// 颜色 /// </summary> [Serializable] public class RedColor:IColor { public int Red { get; set; } public int Green { get; set; } public int Blue { get; set; } public Factroy f { get; set; } public IColor Clone() { SerializableHelper s = new SerializableHelper(); string target = s.Serializable(this); return s.Derializable<IColor>(target); } } }
序列化帮助类:
/// <summary> /// 序列化和反序列化辅助类 /// </summary> public class SerializableHelper { public string Serializable(object target) { using (MemoryStream stream = new MemoryStream()) { new BinaryFormatter().Serialize(stream, target); return Convert.ToBaseString(stream.ToArray()); } } public object Derializable(string target) { byte[] targetArray = Convert.FromBaseString(target); using (MemoryStream stream = new MemoryStream(targetArray)) { return new BinaryFormatter().Deserialize(stream); } } public T Derializable<T>(string target) { return (T)Derializable(target); } }
测试:
static void Main(string[] args) { IColor color = new RedColor(); color.Red = 255; color.f = new Factroy() { name="湖北工厂" }; Console.WriteLine("color - Factroy:" + color.f.name); //湖北工厂 IColor color1 = color.Clone(); color1.Red = 234; color1.f.name = "北京工厂"; Console.WriteLine("color1- Factroy:" + color1.f.name); //北京工厂 Console.WriteLine("color - Factroy:" + color.f.name); //湖北工厂 Console.Read(); }
程序的运行结果如下:
结论:通过序列化和反序列化形成新的对象。其实只要是项目中要使用原型模式进行对象复制的情况下,都可以通过序列化的形式来进行深复制。
热心网友 时间:2022-05-19 12:05
首先,你应该理解.net是一个新的平台,微软喜欢把.net和COM+结合起来,.net有优秀的、强大的与COM+交互的能力,但是它更是有效的、全新的平台。这就意味着它有自己的强项和弱点。<P title="" P Server(MSMQ)的替代品,所有当你超出简单的ASP.net应用程序时,.net就不能单独胜任。< Queue Message Server(MTS)或者Microsoft Transaction >第二点,因为它的不成熟,为了交付一个完整的.net方案,至少现在你需要把.net和COM+组合起来。例如,在.net中,现在还没有Microsoft XMLns:fo="http://www.w3.org/1999/XSL/Format"><P title="" P XMLns:fo="http://www.w3.org/1999/XSL/Format" Services概念就想使用.net平台技术,其程度超过你没有学习面向对象概念就想开始面向组件编程。< Services紧密地连接在一起。你不能不了解Web >最后一点,.net和Web>Javascript:openWindowRes('DotNetMagazine/2001_12/WhereItIs/Figure1.ASP');">The .net Adoption Timeline</TABLE>从发布方面来说,IT从业者应该知道什么?
记住,这是1.0版本,这不是Visual Studio 7.0;这不是COM++++;这不是Visual Basic 7.0。十分确切的说,这是全新的。它和大量的新代码一起引进。你要特别仔细考虑如何计划.net的采用。特别是在以后的24个月里。<P title="" P XMLns:fo="http://www.w3.org/1999/XSL/Format" one做地更好。< >然而,它里面包括许多很酷的东西。它弥补了和Java之间的巨大差距,在许多情况下,被证明比Java>你对企业什么时候或者是否转向.net有什么建议?
这是一个什么时候将他们拖、拉、或者尖叫着穿过.net的悬崖的问题,而不是是否需要穿过.net悬崖的问题,不管他们是否愿意。然而,我不希望看见许多人试图一次重写他们的所有的Visual Basic代码或者Visual C++代码。我们应该逐步的开展。.net将很快被引用到新的开发中。在Visual Studio .net出现的头一两年,你将会看到一个混合模型,新开发的代码中30%的将是ASP.net代码(我预见ASP.net的扩展将会非常非常之快),但是70%将仍然是COM,COM+代码。商业应用
Javascript:openWindowRes('DotNetMagazine/2001_12/WhereItIs/BusinessCase.htm');">计划向新技术转移
由于.net的许多优势和微软的强大的市场努力,.net技术在应用程序开发中最终将被广泛采用几乎是可以肯定的,特别是对于中小型企业....
</TABLE>我对严谨的客户的一般建议是,不要把有紧急任务的应用程序在很大程度上依赖于.net,至少在.net发布后六到九个月不要这样做,即2002年8月之前。<P title="" P XMLns:fo="http://www.w3.org/1999/XSL/Format" >然而,为了实践的目的,你可以用.net做一些小的原型,一些没有紧急任务要求的程序。这取决于beta代码,第一个产品版本,或者第一个服务包能为你带来些什么。尽管如此,我们推荐你采取保守的方法。假设一个糟糕的情况:你的30%-40%代码将迁移,你将不得不重写或者重设计剩下的代码。别指望微软会提供自动工具来迁移你的代码。<>对早期的采用者也有一些好的原因。首先是显示公司在Web Services策略方面的竞争力,你正在寻找在接下来的12个月里支持Web Services最好的平台。<P title="" P XMLns:fo="http://www.w3.org/1999/XSL/Format" >ASP.net是另一个原因。太多的程序员从事ASP的开发,如果你正在ASP执行或者安全方面苦苦挣扎,或者受够了整个ASP的生存空间。ASP.net是一个更强大的环境。实际上,微软已经有了大量的早期采用者,他们已经在ASP.net系统的测试版下开发。<><P title="" P XMLns:fo="http://www.w3.org/1999/XSL/Format" >还有,最重要的是,如果你有一个真正的商业原因,你就应该早点采用。例如,如果你正在开发一个无线的应用程序,ASP.net有一些重要的新特征正好可以帮你实现,在许多情况下,冒险早期迁往.net是因为它在移动和无线设备方面做得更好。<>如果你不关心Web Services,这里没有一个无可抵抗的和强制性的原因,让你去很快地采用它。实际上,这就是我们说为什么大多数公司将采用一个相当渐进的曲线来采用它。有许多因素要考虑。要看多少人采用这种主流技术。要参考专家的建议。要看第三方的支持、前景市场的支持。要看本地的.net服务的组件提供者。要看所有的测试公司。要看源代码管理公司的提供。Visual Studio .net发布的第一年,早期的采用者将会把他们的代码按70/30的比例划分在旧平台和新平台上。在大约一年半后,我们期待比率会变成30/70。你将看到70%的本地.net代码将出现在基于微软的解决方案中。传统的公司将在Visual Studio .net发布后的24到36个月开始迁移。大约2005年,我们将期待95%的本地.net开发。让我们来讨论.net语言和在迁移应用程序到.net的过程中起作用的部分,从Visual Basic .net开始。
这是一个好消息,Visual Basic 变成了一种成熟的语言。它开始面向对象设计,使用类框架和.net中的其它零碎,VB.net已经变成了一个更强大的工具集。事实上,还没有哪些商业应用程序不能用VB来实现。<P title="" P XMLns:fo="http://www.w3.org/1999/XSL/Format" Basic开发者将有一个艰难的学习过程才能最后完成迁移。< >不利的是VB.net有了许多新的语法和设计问题。这意味着对Visual>我认为在接下来的48个月中,60%或者更多的C++开发者将转向C#.C++将仍然会使用。它将会使用在COM和COM+领域,甚至在.net中它将仍然会被使用,但是它将仍是系统层的编程语言。C#的快速开发应用程序的能力和C#和.net组件模型集成工作的能力将会起到一个大的作用。这是我从用户那儿听到的最多的问题。我可能今年与*百人讨论过,几乎一半的问题都是直接地或间接地关于.net与Java相比较的问题。我告诉他们我认为Microsoft和Java将支配电子商务应用程序开发,也就是说,大多数新的项目将会基于这两个平台之一。他们到2005年将占有80%的市场。谁也不会。大多数大公司将会两者都使用。现在,Java基于它的跨平台的能力,在大公司中还有很强的实力。小公司不能负担得起使用两者,他们将会转向其中之一。微软因为它的成本低和众多的开发者,对中小型组织还是很有吸引力的。为了完成.net难题还需要做什么?
中间件架构应该被拿走。我们需要MTS的替代品。我们需要一个与本地.net同步的messaging broker。更有效的是,我们需要作为本地.net服务的COM+的替代品。当然。你已经有了数据库APIs和类似的功能。但是我们需要的是Java 2平台、J2EE在.net上的替代品。现在,如果你仔细看那些零碎功能的话,我们已经有了一半了。有一个清晰的Java 2平台、标准编辑器(J2SE)的替代品,不久我们就会有Java 2平台、J2ME的替代品—J2ME与.net Framework紧密相关。但是,微软还没有建立一个真正的J2EE的替代品。我们需要看到.net技术注入SQL Server,这在SQL server的下一个主流产品Yukon中将会看到。我们需要看到各种.net技术,像BizTalk,具有讽刺意味的是,它现在还什么都不能做。微软的门户网站,电子商务软件,所有的零碎东西都需要在.net上执行。他们需要整合将被淘汰的技术。你提到了Web Services的重要性,那我们将会先看到哪种类型的Web Services呢?
我前面提到大多数公司将会同时使用Java和微软的技术。Web Services是一个很好的方法来整合它们并使他们可以交互操作。我们认为Web Services在移动基于所有权信息方面起着相当重要的作用。<P title="" P XMLns:fo="http://www.w3.org/1999/XSL/Format" Services的问题,就象其它问题一样,还很不成熟。实际上,现在整个XML消息的概念还极不成熟。我们现在只有所有的5%或者10%,我们最终需要全部的XML基础。< >Web><P title="" P XMLns:fo="http://www.w3.org/1999/XSL/Format" Services将是一个文化问题。企业将不得不适应系统开放的思想和实时工作的思想。好消息就是有了许多用B2B的基础。一些特别纵向联合的企业已经大规模地采用这种方式。< >我认为抑制在公共的互联网上使用Web>我认为在使用这项技术时仍然缺少技巧。许多开发者将把Web Services当作分布式对象模型一样执行。他们将说“好的,Web Services仅仅是包装了DCOM或者COM组件和Enterprise Java Beans组件,”,这是不对的。Web Services是松耦合的、异步消息协议,而不是锁定的、同步机制。人们第一次将不可避免的犯错误。<P title="" P XMLns:fo="http://www.w3.org/1999/XSL/Format" Services将不会变成主流。< Services会有很好的前途,它会是无处不在的相当廉价的服务通讯机制。不管这些服务是在一个子系统,一个企业、跨越一个行业内,或者甚至跨越不同的行业。你可以减少进入这个商业领域的障碍。但是这些好处将不得不和组织结构带来的新问题相比较。这样,我们认为2003年之前的这段时间,Web >你可以相信Web>这是现在Web Services的一个大黑洞。我们还没有看到任何好的定价模式。我认为我们将会看到,在某种程度上,小的付款模式将会一点点出来。但是还没有回答大的付款模式的例子。你知道,我把HailStorm看作是一个大的、具体化的Web Services的例子。然而现在我听到大量的反对声,因为它是微软的。人们认为这是微软控制互联网的“Phase II”。我相信如果它不是从微软而是其他的公司,HailStorm将会直接受到大家的欢迎。让我惊讶的是,如果AOL或者和它的合作伙伴不提出和HailStorm长期竞争力的产品。我相信它会成功。我认为人们非常关注的电子商务将会有同样纵向联系的市场。已经转向电子商务的行业将会是第一个使用Web Services的行业。它是下一个逻辑*。</A>