欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

原型模式(创建型)

程序员文章站 2022-06-13 15:23:42
...

定义:
使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。
两个角色:
抽象原型类:定义抽象原型,可以是抽象类也可以是接口,需要继承Cloneable接口或自行设计克隆接口。
具体原型类:实现抽象原型类中保留的方法。

浅克隆:仅仅复制原型对象以及其中的值类型变量,引用类型变量不会被复制而是传递引用。
深克隆:复制原型对象以及其中的所有成员变量。


浅克隆:

// 抽象原型类  实现Cloneable接口并重写clone方法
public abstract class AbstractCopy implements Cloneable
{

    protected int id;
    protected Sun sun;
    
    public abstract void func();

    @Override
    protected Object clone() throws CloneNotSupportedException
    {
        return super.clone();
    }
}

//具体原型类
public class Copy extends AbstractCopy
{

    public Copy(int id, Sun sun)
    {
        this.id = id;
        this.sun = sun;
    }

    @Override
    public void func()
    {
        System.out.println("id = "+id);
        System.out.println(sun.toString());
    }
}

// 引用类型对象
public class Sun{
    private int id;
    private String name;

    public Sun(int id, String name)
    {
        this.id = id;
        this.name = name;
    }
    // geter/seter 
    .....
    @Override
    public String toString()
    {
        return "Sun{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
// 客户端
public class Client{
    public static void main(String[] args) throws CloneNotSupportedException
    {
        AbstractCopy copy = new Copy(1,new Sun(1,"suntd"));
        AbstractCopy cc = (AbstractCopy) copy.clone();
        copy.func();
        cc.func();
    }
}
Output:
id = 1
Sun{id=1, name='suntd'}
id = 1
Sun{id=1, name='suntd'}

深克隆:

// 抽象原型类同上

// 具体原型类
public class Copy extends AbstractCopy{
    public Copy(int id, Sun sun)
    {
        this.id = id;
        this.sun = sun;
    }

    @Override
    public void func()
    {
        System.out.println("id = "+id);
        System.out.println(sun.toString());
    }
 
    // 重写 clone 方法实现深克隆
    @Override
    protected Object clone() throws CloneNotSupportedException
    {
         Sun sunn = (Sun) sun.clone();
        return new Copy(id,sunn);
    }
}

//  客户端方法同上