编程语言
首页 > 编程语言> > java-設計模式-原型模式

java-設計模式-原型模式

作者:互联网

 

原型模式

是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。

 

 

問題:

如果我們要複製一個類實例:

首先, 你必须新建一个属于相同类的对象。 然后, 你必须遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中。

但是:并非所有对象都能通过这种方式进行复制, 因为有些对象可能拥有私有成员变量, 它们在对象本身以外是不可见的。

而且我們複製的時候需要知道勢力的具體類,如果這個類實現的是接口,那就男判定

 

解決:

原型模式将克隆过程委派给被克隆的实际对象。 模式为所有支持克隆的对象声明了一个通用接口, 

该接口让你能够克隆对象, 同时又无需将代码和对象所属类耦合。 

通常情况下, 这样的接口中仅包含一个 克隆方法

 

實現方法:

  1. 原型 (Prototype) 接口将对克隆方法进行声明。 在绝大多数情况下, 其中只会有一个名为 clone克隆的方法。

  2. 具体原型 (Concrete Prototype) 类将实现克隆方法。 除了将原始对象的数据复制到克隆体中之外, 该方法有时还需处理克隆过程中的极端情况, 例如克隆关联对象和梳理递归依赖等等。

  3. 客户端 (Client) 可以复制实现了原型接口的任何对象。

 

應用場景

1如果你需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类, 可以使用原型模式。

 

 

簡單例子

/**
 * 原型模式:需要继承Cloneable接口,
 * Cloneable接口是抽象的原型类。犹如我们类里面的object
 *
 * 优点: 基于内存二进制流的复制,更加高效,性能比new方法的好
 * 缺点:每个类都需要一个clone方法。
 *      clone方法位于内部,对已经存在的类修改,需要修改类的代码
 *      可能存在深克隆,多个类嵌套的时候,克隆复杂,每一层的对象都必须支持深克隆。
 *
 * 应用场景:
 *  存在相同对象或相似对象的创建问题。如果都是用构造函数进行对象创建。消耗资源,原型模式更加高效
 *
 *
 *  应用结构:
 *      抽象原型:需要实现接口
 *      具体原型类:实现接口的即抽象原型类的clone(),是可被复制的对象
 *      访问类:具体原型中的clone()方法来复制新的对象
 */
public class PrototyeClass implements Cloneable {
    PrototyeClass(){
        System.out.println("具体原型创建成功");
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        System.out.println("原型复制成功");
        return (PrototyeClass)super.clone();
    }
}

 

測試:

public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        PrototyeClass prototyeClass = new PrototyeClass();
        PrototyeClass prototyeClass1 = (PrototyeClass) prototyeClass.clone();
        PrototyeClass prototyeClass2 = (PrototyeClass) prototyeClass.clone();
        //看输出的地址,判断是不是同一个实例来的
        System.out.println(prototyeClass+" "+prototyeClass1+" "+prototyeClass2);
        /**
         * 具体原型创建成功
         * 原型复制成功
         * 原型复制成功
         * Prototype.PrototyeClass@61bbe9ba Prototype.PrototyeClass@610455d6 Prototype.PrototyeClass@511d50c0
         */
    }
}

 

标签:java,克隆,对象,clone,設計,模式,PrototyeClass,原型,接口
来源: https://www.cnblogs.com/java-quan/p/13661771.html