前面几章咱们介绍了建立型设计模式的部份内容,今天我要说的是建立型设计模式中最后一个——原型模式,原型模式是建立型模式中的一种较为特殊的模式,有个最大的特色是克隆一个现有的对象,在咱们平常软件系统开发中,某些对象的建立new即为复杂,并且咱们须要使用多个相同的实例,这样若是咱们依旧使用new去进行建立。就会增长系统的复杂度和增长代码之间的耦合度。可是咱们使用前面介绍的工厂模式的话,随着产品类型的增多,子类也会随之增多。维护代码的难度也就会愈来愈大,因此这里暂时不适合使用工厂模式。因为实例都是同样的,类型相同。可是实例的参数和状态可能不一样。这里有一个对象,而后再结合咱们今天要讲述的原型模式。能够经过一个原型对象,克隆拷贝出许多其余相同的对象来。html
在面对软件系统设计的过程当中,会面临着”复杂对象”的建立,然而对象可能会因为需求的变更而进行变更。那么咱们又须要保持接口的稳定性。这时如何保证应对这种变化呢?设计模式
建立型模式通常是用来建立一个新的对象,而后咱们使用这个对象完成一些对象的操做,咱们经过原型模式能够快速的建立一个对象而不须要提供专门的new()操做就能够快速完成对象的建立,这无疑是一种很是有效的方式,快速的建立一个新的对象。ide
使用原型实例指定建立对象的种类,而后经过拷贝这些原型来建立新的对象。学习
在原型模式中包含的组成部分较少:优化
抽象原型类:原型类,声明一须要实现的接口及clone自身的方法this
具体原型类:实现其他接口及clone自身的方法spa
咱们来看这么一个示例,我记得小时候上课的时候有时候就想着出去玩,就望着窗户发呆。又出不去。就想本身能够分身就行了。就能够一个留在教室学习,一个出去玩耍,学习能够一次性学习多门功课,玩耍能够一次玩多个游戏。这样就什么都没有耽误,多好呀。固然也只是想一想,实现这个暂时是不可能的了。虽说现实中没办法实现了。恰好今天讲原型模式,就借用这个示例来说解原型模式究竟是如何使用的吧:设计
namespace Prototype_Pattern { class PrototypePattern { } #region 抽象原型类=========== public abstract class Prototype { /// <summary> /// 当前本身的状态 /// </summary> public abstract void Status(); /// <summary> /// 当前本身在作的事情 /// </summary> public abstract void Action(string things); /// <summary> /// 拷贝自身的方法 /// </summary> /// <returns></returns> public abstract Prototype Clone(); } #endregion #region 具体原型类——读书学习 ============= public class LearnPrototype : Prototype { public override void Status() { Console.WriteLine("当前状态:好好学习"); } public override void Action(string things) { Console.WriteLine(things); } public override Prototype Clone() { return (LearnPrototype)this.MemberwiseClone(); } } #endregion #region 具体原型类——外出玩耍 ============= public class PlayPrototype : Prototype { public override void Status() { Console.WriteLine("当前状态:开心玩耍"); } public override void Action(string things) { Console.WriteLine( things); } public override Prototype Clone() { return (PlayPrototype)this.MemberwiseClone(); } } #endregion }
class Program { static void Main(string[] args) { //学习 Prototype learnPrototype = new LearnPrototype(); learnPrototype.Status(); learnPrototype.Action("一号在学习:语文"); Prototype learnPrototype1 = learnPrototype.Clone(); learnPrototype.Status(); learnPrototype.Action("二号在学习:数学"); //玩耍 Prototype playPrototype = new PlayPrototype(); playPrototype.Status(); playPrototype.Action("一号在玩耍:游戏王"); Prototype playPrototype1 = playPrototype.Clone(); learnPrototype.Status(); learnPrototype.Action("二号在玩耍:四驱赛车"); } }
一、在处于资源优化的时候,减小new类的初始化的数量以减小资源消耗code
二、一个对象多个利用修改,将一个对象提供给多个调用者使用。htm
一、原型模式向客户端隐藏了建立对象的复杂性,提供Clone进行浅拷贝
二、原型类容许动态的增长或减小产品类
三、产品类不须要先肯定产品的等级结构,原型模式适用于任何等级结构
一、每个类都须要配备一个克隆方法
二、配备克隆方法须要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不必定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
到这里建立型的五个设计模式咱们就暂时的介绍完毕了。 在学习设计模式的时候须要多思考,多斟酌。最好在重构之时考虑加入设计模式。保证设计模式发挥最大的用处。到这里建立型模式讲完了。单例模式关注的是对象实例个数的问题。控制对象仅有一个实例,全局访问调用。工厂模式和抽象工厂模式解决的是”单个对象”及”一系列对象”的问题。而建造者模式关注解决的是”对象部分”的问题。今天讲的原型模式能够算的上一个特殊的工厂模式。原型模式通常极少单独使用,通常是配合工厂模式一块儿使用的。接下来的时间中给你们带来的是结构型的设计模式解析
平凡人生要用平凡的心去对待,你的人生将会更精彩。
欢迎你们扫描下方二维码,和我一块儿踏上设计模式的闯关之路吧!