原型模式要克隆什么?
转自:《模式——工程化实现及扩展》(设计模式C#版和Java版)
原型模式梗概:它构造的过程就是选择一个对象(被称为原型对象或“样本”),通过调用它的“克隆”方法就获得一个和它一样的对象,一般我们称这个克隆出的结果为 “副本”。
项目中,原型模式有些悲哀,因为它总是被大家忘掉。但在.NET Framework/JVM底层,克隆本身又是个By Design的内置机制,客户端、服务器端传递业务对象本身就是咫尺天涯,克隆对象必不可少。
软件系统中往往总存在某个不稳定的业务领域,其中类型的变化和扩充别频繁,不仅是继承深度上的,还有可能是来自于平级类型的宽度上的。按照前面的思路,为了尽量让客户程序构造它们的时候不必与每个具体类型产生深度或广度上的直接依赖,需要借助其他对象来封装这个new()的过程。之前我们介绍过简单工厂、工厂方法模式和抽象工厂模式,但如果对象类型的变化相对太频繁,有时候“没完没了”地为它们创建各种工厂不值得。
经典原型模式用的就是这个思路:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
仔细解读还可以发现尽管一般设计模式书籍的示例都会克隆整个目标实例,但在经典原型模式的介绍中并没有这个要求。与生活中的克隆技术一样,有的科学家在克隆羊、克隆牛甚至在偷偷摸摸的克隆人,但还有很多科学家专注于克隆人体的一部分,比如:心脏、上肢……,实际项目中我们使用原型模式时也可以借鉴这个思路,
比如:
- 一个复杂对象的可能提供clone()方法克隆整个对象
- 也可以同时提供clonePartA()、clonePartB()等方法克隆出局部对象
- 进一步,甚至可以克隆出相对独立的其他类型,就好像我们克隆一个博文对象,克隆的不是整个博文、也不是其中的文字、插图,而是在1024 x 768分辨率下这篇博文的在IE 8.0下一个截图(Image类型)
另外,有的时候我们需要构造不是“若只如初见”的类型实例,而是需要构造与某个对象“当时”状态一样的实例。
贸易电子化,技术全球化