关于“原型模式”的具体讲解请看笔者博客

《设计模式》第二部分 创建型设计模式 第6章 原型模式(A:C++实现)

此文是“原型模式”的Java实现。

原型模式的克隆分为浅克隆和深克隆,Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,这里的 Cloneable 接口就是抽象原型类。其代码如下:

步骤一:具体原型类

package com;

public class ConcretePrototype implements Cloneable{

	public ConcretePrototype()
	{
		System.out.println("具体原型创建成功!");
	}
	
    public Object clone() throws CloneNotSupportedException
    {
        System.out.println("具体原型复制成功!");
        return (ConcretePrototype)super.clone();
    }
}

步骤二:测试

package com;

public class Main {

	public static void main(String[] args) throws CloneNotSupportedException {
		
		ConcretePrototype obj1= new ConcretePrototype();
		ConcretePrototype obj2 = (ConcretePrototype)obj1.clone();
		
		System.out.println("obj1==obj2? " + (obj1==obj2));
	}
}

结果如下所示:
《设计模式》第二部分 创建型设计模式 第6章 原型模式(B:Java实现)_原型模式
为了进一步说明,再举一个例子吧。同一学校的“三好学生”奖状除了获奖人姓名不同,其他都相同,属于相似对象的复制,同样可以用原型模式创建,然后再做简单修改就可以了。图3所示是三好学生奖状生成器的结构图。

《设计模式》第二部分 创建型设计模式 第6章 原型模式(B:Java实现)_原型模式_02

图1奖状生成器的结构图

代码如下所示:

Citation.java

package com;

public class Citation implements Cloneable{
    
	String name;
    String info;
    String college;
    Citation(String name,String info,String college)
    {
        this.name=name;
        this.info=info;
        this.college=college;
        System.out.println("奖状创建成功!");
    }
    void setName(String name)
    {
        this.name=name;
    }
    String getName()
    {
        return(this.name);
    }
    void display()
    {
        System.out.println(name+info+college);
    }
    public Object clone() throws CloneNotSupportedException
    {
        System.out.println("奖状拷贝成功!");
        return (Citation)super.clone();
    }
}

Main.java

package com;

public class Main {

	public static void main(String[] args) throws CloneNotSupportedException {
		
        Citation obj1=new Citation("张三","同学:在2016学年第一学期中表现优秀,被评为三好学生。","韶关学院");
        obj1.display();
        Citation obj2=(Citation) obj1.clone();
        obj2.setName("李四"); 
        obj2.display();
	}
}