通俗易懂设计模式解析——原型模式
前言
前面几章我们介绍了创建型设计模式的部分内容,今天我要说的是创建型设计模式中最后一个——原型模式,原型模式是创建型模式中的一种较为特殊的模式,有个最大的特点是克隆一个现有的对象,在我们日常软件系统开发中,某些对象的创建new即为复杂,而且我们需要使用多个相同的实例,这样如果我们依旧使用new去进行创建。就会增加系统的复杂度和增加代码之间的耦合度。但是我们使用前面介绍的工厂模式的话,随着产品类型的增多,子类也会随之增多。维护代码的难度也就会越来越大,所以这里暂时不适合使用工厂模式。由于实例都是一样的,类型相同。但是实例的参数和状态可能不同。这里有一个对象,然后再结合我们今天要讲述的原型模式。可以通过一个原型对象,克隆拷贝出许多其他相同的对象来。
原型模式介绍
一、来由
在面对软件系统设计的过程中,会面临着”复杂对象”的创建,然而对象可能会由于需求的变动而进行变动。那么我们又需要保持接口的稳定性。这时如何保证应对这种变化呢?
创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。
二、意图
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
三、案例图
四、原型模式代码示例
在原型模式中包含的组成部分较少:
抽象原型类:原型类,声明一需要实现的接口及clone自身的方法
具体原型类:实现其余接口及clone自身的方法
我们来看这么一个示例,我记得小时候上课的时候有时候就想着出去玩,就望着窗户发呆。又出不去。就想自己可以分身就好了。就可以一个留在教室学习,一个出去玩耍,学习可以一次性学习多门功课,玩耍可以一次玩多个游戏。这样就什么都没有耽误,多好呀。当然也只是想想,实现这个暂时是不可能的了。虽然说现实中没办法实现了。刚好今天讲原型模式,就借用这个示例来讲解原型模式到底是如何使用的吧:
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("二号在玩耍:四驱赛车"); } }
使用场景及优缺点
一、使用场景
1、在处于资源优化的时候,减少new类的初始化的数量以减少资源消耗
2、一个对象多个利用修改,将一个对象提供给多个调用者使用。
二、优点
1、原型模式向客户端隐藏了创建对象的复杂性,提供Clone进行浅拷贝
2、原型类允许动态的增加或减少产品类
3、产品类不需要先确定产品的等级结构,原型模式适用于任何等级结构
三、缺点
1、每一个类都需要配备一个克隆方法
2、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
总结
到这里创建型的五个设计模式我们就暂时的介绍完毕了。 在学习设计模式的时候需要多思考,多斟酌。最好在重构之时考虑加入设计模式。保证设计模式发挥最大的用处。到这里创建型模式讲完了。单例模式关注的是对象实例个数的问题。控制对象仅有一个实例,全局访问调用。工厂模式和抽象工厂模式解决的是”单个对象”及”一系列对象”的问题。而建造者模式关注解决的是”对象部分”的问题。今天讲的原型模式可以算的上一个特殊的工厂模式。原型模式一般极少单独使用,一般是配合工厂模式一起使用的。接下来的时间中给大家带来的是结构型的设计模式解析
平凡人生要用平凡的心去对待,你的人生将会更精彩。
欢迎大家扫描下方二维码,和我一起踏上设计模式的闯关之路吧!