3,原型模式

一、什么是原型模式

原型模式(Prototype)模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用 原型模式(Prototype)模式创建的实例,具有与原型一样的数据。

二、原型模式的特点

1,由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。

2,目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。

3,根据对象克隆深度层次的不同,有浅度克隆与深度克隆。

三、例子

创建一个原型类:

一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口。

public class Persion implements Cloneable{
    // 姓名
    private String name;
    // 年龄
    private int age;
    // 性别
    private String sex;
    //地址
    private List<String> addr;

    public List<String> getAddr() {
        return addr;
    }
    public void setAddr(List<String> addr) {
        this.addr = addr;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    //浅复制
    public Persion clone() {
        try {
            return (Persion) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

创建一个测试类:

public class TestClass {
    public static void main(String[] args) {
        Persion p1 = new Persion();
        List<String> list = new ArrayList<String>();
        list.add("测试地址");
        p1.setAge(11);
        p1.setName("张三");
        p1.setSex("男");
        p1.setAddr(list);

        System.out.println("P1:age:" + p1.getAge() + " name:" + p1.getName() + " sex:" + p1.getSex() + " addr:" + p1.getAddr().toString());
        //复制一个Persion对象
        Persion p2 = p1.clone();
        System.out.println("P2:age:" + p2.getAge() + " name:" + p2.getName() + " sex:" + p2.getSex() + " addr:" + p1.getAddr().toString());

        //修改后的P2
        p2.setAge(15);
        p2.setName("未完");
        p2.setSex("女");
        //向p1再次添加了一个地址,这会影响到p2的addr,可以看出浅复制对于引用类型复制的是引用类型的地址
        list.add("测试地址2");
        p1.setAddr(list);
        //修改p2并不会影响到p1,
        System.out.println("修改后的P1:age:" + p1.getAge() + " name:" + p1.getName() + " sex:" + p1.getSex() + " addr:" + p1.getAddr().toString());
        System.out.println("修改后的P2:age:" + p2.getAge() + " name:" + p2.getName() + " sex:" + p2.getSex() + " addr:" + p2.getAddr().toString());
    }
}

浅复制和深复制:

浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。

可以看出浅复制对于引用类型只是复制了内存地址,并不是把引用类型再复制一份。我们可以深复制可以吧把引用类型也复制一份。

修改persion的clone方法如下:

//深复制
public Persion clone() {
    try {
        Persion p2 =  (Persion) super.clone();
        List<String> newAddrs = new ArrayList<String>();
        for (String string : addr) {
            newAddrs.add(string);
        }
        p2.setAddr(newAddrs);
        return p2;
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
        return null;
    }
}

同样的测试代码再次运行:这次并没有影响到p2

三、原型模式应用场景

1,在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。

2,希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)。

3,隐藏克隆操作的细节。很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

时间: 2024-12-02 17:20:56

3,原型模式的相关文章

设计模式之原型模式(Prototype)

1.初识原型模式 大家都知道连锁机构是现在灰常流行的商业模式,比如咖啡之翼,那么假设咖啡之翼要在长春新建立一个分店,所经营的产品和以前在其他的城市已经存在的店经营的产品差不多,那么面向对象开发的角度怎么解决这个问题呢?难道要重新的实例化一个咖啡之翼的店??这显然不太好吧,咖啡之翼里面经营的产品(假设是属性吧)都需要重新写,这就是在做大量的重复工作啊,这显然是不符合OO开发思想的.遇到这样的情况,并不是重新建立一个类来解决这样的问题,而是通过设计模式中的"原型模式"来解决这种问题.是这种

设计模式学习笔记(十三:原型模式)

1.1概述 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.这就是原型模式的定义. 在某些情况下,可能不希望反复使用类的构造方法创建许多对象,而是希望使用该类创建一个对象后,以该对象为原型得到该对象的若干个复制品.也就是说,将一个对象定义为原型对象,要求改原型对象提供一个方法,使该原型对象调用此方法可以复制一个和自己有完全相同状态的同类型对象,即该方法"克隆"原型对象得到一个新对象.原型对象和以它为原型"克隆"出的新对象可以分别独立地变化,也就是说,

原型模式

1.与工厂模式类似,都是创建对象的 2与工厂模式不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象,这样就免去了类创建时重复的初始化操作 3.比较适合用于大对象的创建 4.原型模式.解决对象的重复利用,比如一个大对象很多成员有默认参数初始化他们需要很大的时间片,显然创建一个初始化一次是一种浪费, 原型模式就解决了这个问题,php 的clone 是直接吧那片内存拷贝过来,省去了很多时间 例子 假设init里面循环200次为成员赋值 传统编程方法: 原型模式:

设计模式--原型模式C++实现

原型模式C++实现 1定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 2类图 3实现 class Prototype { protected: Prototype(); public: virtual Prototype* Clone() const = 0; vitual ~Prototype() = 0; }; class PrototypeClass:public Prototype { public: PrototypeClass(); PrototypeClass

大话设计模式笔记 原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节. 基本类型与引用类型的区别于关系在efficient java. http://www.cnblogs.com/linkarl/p/4785329.html 浅复制:对象的引用仍然指向原来的对象 深复制:把引用对象的变量指向复制过的新对象 我认为一般深复制比较常用. package prototype; public

设计模式(四) 原型模式(Prototype)

1.定义 原型模式属于一种创建型模式,与其他创建型模式不同,原型模式不是直接构造对象,而是通过复制一个已经存在的实例返回新的实例. 2.适用性 为何要拷贝而不直接生成?我的理解是有些时候直接构造实例花费比较大,比如在构造对象的时候需要做大量的数据库查询,这样如果构造许多类似的对象还重复地查询数据库则开销很大,很没效率.直接拷贝现有的实例,在需要情况下做一些小的修改会显得高效许多. 3.结构 Prototype: 声明一个克隆自身的接口 ConcretePrototype:实现一个克隆自身的操作

设计模式--原型模式

原型模式 Prototype Pattern 意图:使用原型实例定义/指定被创建对象种类/类型,通过拷贝原型实例创建新对象 应用场景: 1)当某个类指定在运行时实例化 2)减少子类数量 3)降低昂贵类型新对象创建成本 好处或缺点: 1)clone方法可能实现比较困难 2)不适用于含循环引用的类结构 类结构: 参与者:client ,Prototype,ConcretePrototype prototype:定义原型的行为 //关键代码 class Notification implements

《JAVA与模式》之原型模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是选型模式的用意. 原型模式的结构 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例.这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新

设计模式之原型模式

原型模式(prototype)为创建型对象模式,它是用原型实例来指定创建对象的类型的,并通过拷贝这些原型来创建新的对象.也就是说,这次我们创建新的对象和以前创建对象的方法有些不同,以前创建新的对象是用new方法作用于类上来实现的,现在我们不这样做了,给定一个类的实例,我们通过克隆这个类的实例来创建新的实例,显然,这个类本身要有能够实现"克隆"机制的方法才行,这样用该类创建出的对象才能拥有"克隆"自己的能力.通过查看java API文档可知,Java语言本身具有克隆对

设计模式学习总结(六)原型模式(Prototype)

原型模式即通过对象拷贝的方式来实现对同类对象的生成的一种设计模式! 浅复制:对于值类型,则直接复制该值,对于引用类型的字段则是对其引用的复制,如果原引用与现引用只要有一个的值发生变化,则都会造成两者值的变化.     深复制:对于值类型,则直接复制该值,对于引用类型的字段则复制其引用的对象,如果有多个/级嵌套引用,则复制所有引用的对象. 一.示例展示: 通过学习及总结,以下是我完成的原型模式的示例: 1. 创建抽象原型类:HandphonePrototype public abstract cl