`
Fis
  • 浏览: 84885 次
  • 性别: Icon_minigender_1
  • 来自: 龙城
社区版块
存档分类
最新评论

Design Pattern: Prototype 模式

阅读更多
  您从图书馆的期刊从发现了几篇您感兴趣的文章,由于这是图书馆的书,您不可以直接在书中作记号或写字,所以您将当中您所感兴趣的几个主题影印出来,这下子您就可在影印的文章上画记重点。

  Prototype模式的作用有些类似上面的描述,您在父类别中定义一个clone()方法,而在子类别中重新定义它,当客户端对于所产生的物件有兴趣并想加以利用,而您又不想破坏原来的物件,您可以产生一个物件的复本给它。

  Prototype具有展示的意味,就像是展览会上的原型车款,当您对某个车款感兴趣时,您可以购买相同款示的车,而不是车展上的车。

  在软体设计上的例子会更清楚的说明为何要进行物件复制,假设您要设计一个室内设计软体,软体中有一个展示家具的工具列,您只要点选工具列就可以产生一个家具复本,例如一张椅子或桌子,您可以拖曳这个复制的物件至设计图中,随时改变它的位置、颜色等等,当您改变设计图中的物件时,工具列上的原型工具列是不会跟着一起改变的,这个道理是无需解释的。

下面的 UML 类别图表示了上述的简单概念:
protoType-1.jpg


  Prototype模式的重点在于clone(),它负责复制物件本身并传回,但这个clone()本身在实作上存在一些困难,尤其是当物件本身又继承另一个物件时,如何确保复制的物件完整无误,在不同的程式语言中有不同的作法。

  在Java中的作法是透过实作一个Cloneable介面,它只是一个声明的介面,并无规定任何实作的方法,您的目的是改写Object的clone ()方法,使其具备有复制物件的功能,这个方面建议您参考:How to avoid traps and correctly override methods from java.lang.Object。

 用一个简单的例子来实作上图中的结构,这个例子利用了Java语言本身的clone特性:
AbstractFurniture.java
    public abstract class AbstractFurniture implements Cloneable {
        public abstract void draw();
        // 在Design Pattern上,以下的clone是抽象未实作的
        // 实际上在Java中class都继承自Object
        // 所以在这边我们直接重新定义clone()
        // 这是为了符合Java现行的clone机制
      protected Object clone() throws CloneNotSupportedException {
             return super.clone();
         }
    }

CircleTable与SquareTable继承了AbstractFurniture,并实作clone方法,用于传回本身的复制品:
CircleTable.java
    import java.awt.*;public class CircleTable extends AbstractFurniture {
        protected Point center;
        public void setCenter(Point center) {
            this.center = center;
        }
        protected Object clone ()
                                   throws CloneNotSupportedException {
             Object o = super.clone();
             if(this.center != null) {
                ((CircleTable) o).center = (Point) center.clone();
            }
                    return o;
         }
         public void draw() {
             System.out.println("\t圆桌\t中心:(" + center.getX()                             + ", " + center.getY()+ ")");
        }
    }

SquareTable.java
    import java.awt.*;public class SquareTable extends AbstractFurniture {
        protected Rectangle rectangle;
        public void setRectangle(Rectangle rectangle) {
            this.rectangle = rectangle;
        }
        protected Object clone ()
                           throws CloneNotSupportedException {
             Object o = super.clone();
             if(this.rectangle != null) {
                 ((SquareTable) o).rectangle = (Rectangle) rectangle.clone();
            }
                    return o;
         }
         public void draw() {
             System.out.print("\t方桌\t位置:(" + rectangle.getX()                             + ", " + rectangle.getY()+ ")");        System.out.println(" / 宽高:(" +                          rectangle.getWidth()                 + ", " + rectangle.getHeight()+ ")");
        }
    }

House是个虚拟的房屋物件,从Prototype复制出来的物件加入至House中:

House.java
import java.util.*;
public class House {
    private Vector vector;
    public House() {
         vector = new Vector();
    }
    public void addFurniture(AbstractFurniture furniture) {
         vector.addElement(furniture);
         System.out.println("现有家具....");
         Enumeration enumeration = vector.elements();
         while(enumeration.hasMoreElements()) {
              AbstractFurniture f = 
                 (AbstractFurniture) enumeration.nextElement();
              f.draw();
         }
         System.out.println();
    } 
}

再来是应用程式本身:
Application.java
        import java.awt.*;public class Application {
        private AbstractFurniture circleTablePrototype;
            public void setCircleTablePrototype(
                       AbstractFurniture circleTablePrototype) {
            this.circleTablePrototype = circleTablePrototype;
        }
        public void runAppExample() throws Exception {
            House house = new House();
            CircleTable circleTable = null;
            // 从工具列选择一个家具加入房子中
         circleTable = (CircleTable) circleTablePrototype.clone();
            circleTable.setCenter(new Point(10, 10));
            house.addFurniture(circleTable);
            // 从工具列选择一个家具加入房子中
          circleTable =  (CircleTable) circleTablePrototype.clone();
            circleTable.setCenter(new Point(20, 30));
            house.addFurniture(circleTable);
         }
          public static void main(String[] args) throws Exception {
            Application application = new Application();
            application.setCircleTablePrototype(
                                new CircleTable());
            application.runAppExample();
        }
    }

Java中的clone()方法是继承自Object,AbstractFurniture的子类别则override这个clone()方法,以复制其本身并传回。

下图为Prototype模式的类别结构图:
protoType-2.jpg


  在 Gof 的设计模式书中给出一个原型模式的应用:一个通用的图型编辑器 Framework。在这个 Framework中有一个工具列,您可以在上面选择音乐符号以加入乐谱中,并可以随时调整音乐符号的位置等等。
  图型编辑器Framework是通用的,然而它并不知道这些音乐符号的型态,有人或许会想到继承图型编辑器Framework来为每个音乐符号设计一个框架子类别,但由于音乐符号的种类很多,这会产生相当多的子类别,为了避免这种情况,可以透过Prototype模式来减少子类别的数目,可以设计出以下的结构:
protoType-3.jpg


  依照这个结构,图型编辑器的Framework可以独立于要套用的特定类别之外,虽然不知道被复制传回的对象型态是什么,但总可以按照 Graphics所定义的介面来操作这些物件。

我的小结:个人认为Prototype模式的核心在于对象的克隆方法,为对象添加了这样一个方法,能轻松的实现各种用户的试体验功能。
  • 大小: 27.5 KB
  • 大小: 16.3 KB
  • 大小: 24.5 KB
分享到:
评论

相关推荐

    36种最新设计模式整理

    Design Pattern: Prototype 模式 Design Pattern: Singleton 模式 Design Pattern: Registry of Singleton 模式 Design Pattern: Default Adapter 模式 31 Design Pattern: Adapter 模式 - Object Adapter 32 ...

    java设计模式源码-DesignPattern:设计模式(Java实现源码)

    DesignPattern项目是设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...

    designpattern:java的设计模式

    designpattern design pattern for java 描述: pattern.p001.factory :工厂模式。 pattern.p002.abstractfactory : 抽象工厂模式。 pattern.p003.singletonEH : 单例模式(饿汉式)。 pattern.p003.singletonLH : ...

    单例模式源码java-DesignPattern:在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在

    DesignPattern 在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern ...

    designPatterns:设计模式

    design pattern 设计模式 创建型设计模式 创建型模式设计到将对象实例化,这类模式都提供了一个方法,将客户从所需要的实例化对象中解耦。 原型模式 Prototype 结构型设计模式 结构型模式可以让你把类或者对象组合到...

    软件体系结构与设计模式课堂笔记.docx

    3.设计模式Design Pattern:创建型模式(厂模式Factory、抽象工厂模式Abstract Factory、单例模式Singleton、建造者模式Builder、原型模式Prototype和对象池模式Object Pool Pattern)、结构型模式(适配器模式、...

    design-pattern-test:设计模式学习

    工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2 结构型模式---这些设计模式关注类和...

    设计模式 design pattern

    3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构...

    java餐饮管理系统源码6-design_patterns:设计模式

    原型模式(Prototype Pattern) 结构型模式 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) ...

    uu-design-pattern:23种设计模式案例

    - creational(创建型模式) |- simplefactory 简单工厂模式案例 |- factorymethod 工厂方法模式案例 |- abstractfactory 抽象工厂模式案例 |- builder 建造者模式案例 |- prototype 原型模式案例 |- singleton 单例...

    《Java Design Patterns》高清完整英文PDF版

    Learn how to implement design patterns in Java: each pattern in Java Design Patterns is a complete implementation and the output is generated using Eclipse, making the code accessible to all....

    design-pattern-java.pdf

    (二) 确保对象的唯一性——单例模式 (三) 确保对象的唯一性——单例模式 (四) 确保对象的唯一性——单例模式 (五) 原型模式-Prototype Pattern 对象的克隆——原型模式(一) 对象的克隆——原型模式(二) ...

    [源代码] 《易学 设计模式》 随书源代码

    第07章 照猫画虎:原型模式 (Prototype) 第08章 独一无二:单例模式 (Singleton) 第09章 一目了然:外观模式 (Facade) 第10章 改头换面:适配器模式 (Adapter) 第11章 越俎代庖:代理模式 (Proxy) 第12章 真人不露相...

    design patterns elements of reusable object-oriented software

    ★附录A介绍了剩下的设计模式:Bridge(桥接)、Builder(生成器)、Chainof Responsibility(责任链)、Flyweight(蝇量)、Interpreter(解释器)、Mediator(中介者)、Memento(备忘录)、Prototype(原型)、...

    C#设计模式-吕震宇

    C#设计模式(9)-Prototype Pattern C#设计模式(8)-Builder Pattern C#设计模式(7)-Singleton Pattern C#设计模式(6)-Abstract Factory Pattern C#设计模式(5)-Factory Method Pattern C#设计模式(4)...

    DesignPatterns:设计模式

    设计模式设计模式:可重用的面向对象软件的元素栏目:如何构建“运行”: Microsoft Visual Studio 2017 v15.7或更高版本Microsoft .Net Framework v4.7或更高版本Microsoft Visual C ++ 2017年

    Java.Design.Patterns.1537192353

    PROTOTYPE PATTERN ADAPTER PATTERN COMPOSITE PATTERN PROXY PATTERN FAÇADE PATTERN DECORATOR PATTERN FLYWEIGHT PATTERN TEMPLATE METHOD PATTERN MEDIATOR PATTERN CHAIN OF RESPONSIBILITY ... OBSERVER ...

    DesignPattern

    #DesignPattern 《研磨设计模式》书中的例子 --第二章:简单工厂 本质:选择实现 --第三章:外观模式(Facade) 本质:封装交互,简化调用 --第四章:适配器模式(Adapter) 本质:转换匹配,复用功能 --第五章:单例...

Global site tag (gtag.js) - Google Analytics