`
ideal46
  • 浏览: 30308 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

原型模式

 
阅读更多
定义:通过克隆对象减少创建对象的成本。
优点及使用:
  • 当很多子类仅仅是类型不同的时候使用
  • 当一个系统需要独立于创建,整合和显示的时候
  • 动态绑定或者动态加载方法
  • 只是通过改变实力的状态或者参数就可以完成任务
  • 运行时添加或者删除对象
  • 通过改变结构指定新对象
  • 用类动态配置应用程序
  • 相关模式包括:
  •           抽象工厂:与原型模式一起使用,抽象工厂存储多种原型
              混合模式:与原型模式一起使用完成整体部分关系
              挂件模式:给原型添加另外的一些功能


例子:
动态加载是典型的面向对象特点和原型模式的例子,例如,重载方法就是一种原型模式。
interface Shape {
   public void draw();
} 
class Line implements Shape {
   public void draw() {
       System.out.println("line");
   }
}
class Square implements Shape {
   public void draw() {
       System.out.println("square");
   }
}
class Circle implements Shape {
   public void draw() {
       System.out.println("circle");
   }
}
class Painting {
    public static void main(String[] args) {
        Shape s1 = new Line();
        Shape s2 = new Square();
        Shape s3 = new Circle();
        paint(s1);
        paint(s2);
        paint(s3);
    }
    static void paint(Shape s) {
        s.draw();
    }
}

如果想让代码更有可读性或者做更多的事情,我们可以像下边这样编码
   static void paint(Shape s){
        if ( s instanceof Line)
           s.draw();
           //more job here
        if (s instanceof Square)
           s.draw();
           //more job here
        if (s instanceof Circle)
           s.draw();
           //more job here
   }


paint方法在运行时可以有各种形状的参数,draw方法根据运行时类型被调用。
重载方法也是一种原型。
class Painting {
   public void draw(Point p, Point p2) {
       //draw a line
   }
   public void draw(Point p, int x, int y) {
       //draw a square
   }
   public void draw(Point p, int x) {
       //draw a circle
   }
}

draw方法根据参数被调用画出对应的形状。
原型主要用来克隆一个对象,也就是说做一个对象的拷贝。当创建对象时很复杂或者很费时间,这时候我们就可以选择原型模式来克隆这些对象。假设复杂类创建时候比较复杂,你需要实现Cloneable接口并且覆盖clone方法(protected clone())。
class Complex implements Cloneable {
    int[] nums = {1,2,3,4,5};
    public Object clone() {
        try {
           return super.clone();
        }catch(CloneNotSupportedException cnse) {
            System.out.println(cnse.getMessage());
            return null;
        }
    }
    int[] getNums() {
       return nums;
    }
}
class Test {
   static Complex c1 = new Complex();
   static Complex makeCopy() {
      return (Complex)c1.clone();
   }
   public static void main(String[] args) {
       Complex c1 = makeCopy();
       int[] mycopy = c1.getNums();
       for(int i = 0; i < mycopy.length; i++)
          System.out.print(mycopy[i]);
   }
}

克隆是原对象的影子拷贝,如果被克隆的对象变了,原来的对象也会跟着做同样的改变。
class Complex implements Cloneable {
    int[] nums = {1,2,3,4,5};
    public Object clone() {
        try {
           return super.clone();
        }catch(CloneNotSupportedException cnse) {
            System.out.println(cnse.getMessage());
            return null;
        }
    }
    int[] getNums() {
       return nums;
    }
}
class Test {
   Complex c1 = new Complex();
   Complex makeCopy() {
      return (Complex)c1.clone();
   }
   public static void main(String[] args) {
       Test tp = new Test();
       Complex c2 = tp.makeCopy();
       int[] mycopy = c2.getNums();
       mycopy[0] = 5;

       System.out.println();
       System.out.print("local array: ");
       for(int i = 0; i < mycopy.length; i++)
          System.out.print(mycopy[i]);
       System.out.println();

       System.out.print("cloned object: ");
       for(int ii = 0; ii < c2.nums.length; ii++)
          System.out.print(c2.nums[ii]);
       System.out.println();

       System.out.print("original object: ");
       for(int iii = 0; iii < tp.c1.nums.length; iii++)
          System.out.print(tp.c1.nums[iii]);
}

为了避免这种负面影响,你需要深度拷贝来替代影子拷贝,下边是对上边修改的例子,注意Complex没有实现Cloneable接口。
class Complex {
    int[] nums = {1,2,3,4,5};
    public Complex clone() {
        return new Complex();
    }
    int[] getNums() {
       return nums;
    }
}
class Test2 {
   Complex c1 = new Complex();
   Complex makeCopy() {
      return (Complex)c1.clone();
   }
   public static void main(String[] args) {
       Test2 tp = new Test2();
       Complex c2 = tp.makeCopy();
       int[] mycopy = c2.getNums();
       mycopy[0] = 5;

       System.out.println();
       System.out.print("local array: ");
       for(int i = 0; i < mycopy.length; i++)
          System.out.print(mycopy[i]);
       System.out.println();

       System.out.print("cloned object: ");
       for(int ii = 0; ii < c2.nums.length; ii++)
          System.out.print(c2.nums[ii]);
       System.out.println();

       System.out.print("original object: ");
       for(int iii = 0; iii < tp.c1.nums.length; iii++)
          System.out.print(tp.c1.nums[iii]);
   }
}
0
0
分享到:
评论

相关推荐

    设计模式之原型模式

    原型模式是设计模式中的一种,它是Java 23种经典设计模式之一,主要用来提高对象创建的效率。在原型模式中,我们通过复制或克隆一个已经存在的对象来创建新的对象,而不是通过构造函数来创建。这种方法尤其适用于当...

    设计模式的原型模式的例子

    原型模式(Prototype Pattern)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...

    设计模式之原型模式Java实现和类设计图

    原型模式(Prototype Pattern)是其中一种行为设计模式,主要用于对象创建。它通过复制已有对象来创建新对象,而不是通过传统的构造函数来创建。在Java中,原型模式可以有效地提高性能,特别是在创建复杂对象时。 #...

    设计模式——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...

    设计模式专题之(五)原型模式---设计模式原型模式示例代码(python--c++)

    原型模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在原型模式中,一个对象可以被克隆以创建新对象,而无需知道具体的创建细节。这种模式在需要重复创建相似对象时非常有用,避免了每次创建新对象时都...

    设计模式C++学习之原型模式(Prototype)

    本篇文章将深入探讨“原型模式(Prototype)”这一经典的设计模式,它是面向对象设计的一个重要概念,尤其在C++编程中有着广泛的应用。 原型模式是一种创建型设计模式,它的核心思想是通过复制已有对象来创建新对象,...

    c++20设计模式-第4章-原型模式代码

    原型模式(Prototype Pattern)是其中一种行为设计模式,它允许我们通过复制现有对象来创建新对象,而不是通过传统方式实例化新对象。这一模式尤其适用于创建复杂或昂贵的对象,因为它提供了对象克隆的能力,从而...

    Java 23种设计模式08原型模式.pdf

    ### Java设计模式之原型模式深度解析 #### 模式动机 在面向对象编程的世界里,对象的创建往往伴随着复杂的逻辑处理。特别是在某些场景下,对象的构造过程可能涉及大量资源的消耗,例如数据库连接、文件读写等。在...

    ava常用设计模式-原型模式

    ava常用设计模式-原型模式 原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象...

    设计模式之原型模式.docx

    【设计模式之原型模式】 设计模式是软件工程中的一种最佳实践,是对在特定上下文中反复出现的软件设计问题的解决方案。原型模式属于对象创建型模式,它的主要思想是通过复制已有对象来创建新对象,降低了类的实例化...

    23种设计模式详解PDF

    设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...

    C#23种设计模式样例代码和UML图

    C#23种设计模式样例代码和UML图等 创建型模式(抽象工厂模式、工厂方法模式、单例模式、建造者模式、原型模式); 行为型模式(策略模式、 迭代器模式、原型模式、职责链模式、 模板方法、 命令模式、 解释器模式、 ...

    《Java设计模式》课后习题参考答案-刘伟(20180723).pdf

    JDK中许多类和方法都使用了设计模式,这些模式的应用帮助实现了代码的高内聚、低耦合,提高了代码的可维护性和扩展性。下面介绍几种常见的设计模式及其在JDK中的应用实例: a) 抽象工厂模式(AbstractFactory) ...

    前端设计模式大全,包括工厂模式,原型模式,构造器模式等

    本资料集包含了多种重要的前端设计模式,如工厂模式、原型模式和构造器模式,下面将详细阐述这些模式的核心概念和应用。 1. 工厂模式: 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过抽象出...

    设计模式_原型模式.zip

    这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高...

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...

Global site tag (gtag.js) - Google Analytics