2.4 Prototype(原型)

【返回目录】

中国人有剪纸的传统,尤其是遇到红白喜事时,人们往往会用各种纸张裁剪出各式各样的剪纸作品,比如大红囍字、剪纸画、汽车、洋房等等。不同的物品要由不同类型的纸张来剪才合适,例如,没人用土黄的马粪纸去剪那个又红又亮的“囍”字、也不会有人用A4的复印纸来剪那种洒向满山遍野的纸钱。纸分很多类,每一类里面又有很多种,每一种里面可能又有很多型号,国人对纸的选用是很讲究的,不过剪刀嘛,无外乎就那几种,不会有人要求每一种纸要对应一种剪刀,对于剪纸来说用的就是日常的剪刀,裁缝的大剪刀过于粗犷、医生的手术剪刀过于精贵,都不适用。

这就是Prototype(原型)模式适用的场景:你可以通过同样的工具类来创建不同的对象实例,而这些对象实例的类又都继承自同一个基类。工具类并不知道如何创建和处理对象,如果为每一种对象创建一个工具类会造成很多重复的代码和类似的对象,这不利于开发和维护工作。比较好的办法是让工具类通过拷贝或者克隆的方式来创建新的类对象,我们把这个基类称为Prototype,所有继承自该基类的子类都实现一个自身克隆的方法,这样这个工具类就可以“克隆”出所有类型的子类对象了。我们来看看代码吧:

   1: using System;
   2:  
   3: namespace Autumoon.DesignPatterns.Prototype
   4: {
   5:     public abstract class PaperPrototype
   6:     {
   7:         public abstract PaperPrototype SelfClone();
   8:     }
   9:  
  10:     public class RicePaper : PaperPrototype
  11:     {
  12:         public override PaperPrototype SelfClone()
  13:         {
  14:             return (PaperPrototype)MemberwiseClone();
  15:         }
  16:     }
  17:  
  18:     public class Forfex
  19:     {
  20:         public PaperPrototype InternalPrototype { get; set; }
  21:  
  22:         public void Cut()
  23:         {
  24:             PaperPrototype paper = this.InternalPrototype.SelfClone();
  25:  
  26:             // TODO: Do some cut operation.
  27:         }
  28:     }
  29: }

这样一来,作为工具类的Forfex(剪刀)就不必担心自己不确定所要操作的是什么类型,而只需要把精力集中于Cut(裁剪)操作上了。

   1: static void Main(string[] args)
   2: {
   3:     RicePaper ricePaper = new RicePaper();
   4:     Forfex forfex = new Forfex();
   5:     forfex.InternalPrototype = ricePaper;
   6:     forfex.Cut();
   7:  
   8:     Console.ReadLine();
   9: }

Decoupage

posted @ 2007-12-10 14:16  麦机长  阅读(833)  评论(0编辑  收藏  举报