[设计模式]原型模式

简介: 简介原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式)。 结构 图-原型模式结构图 Prototype:声明一个克隆自身的接口。

简介


原型模式 (Prototype) 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式是一种 对象创建型模式可参考 设计模式 创建型模式)。


结构


图-原型模式结构图
Prototype:声明一个克隆自身的接口。
ConcretePrototype 实现克隆自身的具体操作。
Client 调用 Prototype 来克隆自身,从而创建一个新对象。


动机


当要实例化的类是在运行时刻指定时,例如,通过动态装载。
为了避免创建一个与产品类层次平行的工厂类层次时。
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 

 

浅拷贝与深拷贝


浅拷贝是指当对象的字段值被复制时,字段引用的对象不会被复制。
例如:如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅拷贝,那麽两个对象将引用同一个字符串。
深拷贝是指当一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝。

实例


原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:
  1. 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
  2. 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。 

代码

class Prototype  implements Cloneable {
     public Prototype clone() {
        Prototype prototype =  null;
         try {
            prototype = (Prototype) super.clone();
        }  catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
         return prototype;
    }
}

class ConcretePrototype  extends Prototype {
     public  void show() {
        System.out.println("原型模式实现类");
    }
}

public  class PrototypePattern {
     public  static  void main(String[] args) {
        ConcretePrototype cp =  new ConcretePrototype();
         for( int i=0; i< 10; i++){  
            ConcretePrototype clonecp = (ConcretePrototype)cp.clone();  
            clonecp.show();  
        }  
    }
}


推荐阅读


本文属于 设计模式系列


参考资料


《大话设计模式》

《HeadFirst设计模式》
目录
相关文章
|
7月前
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
|
设计模式 安全 Java
设计模式之-原型模式(三妻四妾)
  原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。我们在程序设计的时候通常会创建很多对象,并且随着不断地开发,会发现在使用过程很多对象是相似甚至是相同的,如果没有使用原型模式,那么我们需要进行下面类似的操作(翻出以前的代码),大量的set方法,这代码看起来十分的“工整”,“干净”,但是全部是无脑式的体力劳动,没有半点技术含量,这种方式不仅浪费了大量的时间去写,其效率还不高,因为需要进行对象的初始化,还要一个一个的赋值,原型模式就是为了来解决这种无脑式的操作。
82 0
|
6月前
|
设计模式 Java Spring
设计模式——原型模式
设计模式——原型模式
|
7月前
|
设计模式 Java
设计模式之原型模式
设计模式之原型模式
|
7月前
|
设计模式
设计模式 | 原型模式
设计模式 | 原型模式
47 0
|
设计模式 C++
设计模式之原型模式(C++)
设计模式之原型模式(C++)
|
设计模式 Java Windows
设计模式~~~原型模式
设计模式~~~原型模式
49 0
|
设计模式 Java 数据库连接
从零玩转设计模式之原型模式
从零玩转设计模式之原型模式
60 0
|
设计模式 JavaScript 安全
【3W2H设计模式】- 原型模式
【3W2H设计模式】- 原型模式
243 0
|
设计模式 Java uml
《设计模式》原型模式
《设计模式》原型模式
102 0
《设计模式》原型模式