原型模式

原型模式

定义
在软件系统中,有时需要多次创建某一类型的对象,为了简化创建过程,可以只创建一个对象,然后通过对象克隆的方式复制出多个相同的对象,这就是原型设计模式。
原型设计模式是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新对象。原型设计模式允许一个对象再创建另一个可定制的对象,而不需要知道在创建的细节。
原型模式结构分析
1.Prototype(抽象原型类)
抽象原型类是定义具有克隆自己的方法的接口,是所有具体原型类的公共父类,可以是抽象类,也可以是接口
2.ConcretePrototype(具体原型类)
具体原型类实现了具体的克隆方法,在克隆方法中返回一个自己的克隆对象。
3.Client(测试类)
让原型对象克隆一个自己的对象,从而创建出一个新的对象,在测试类中只需要自己new一个对象或者通过工厂方法创建一个对象,然后在调用该对象的克隆方法就可以得到多个复制出来的对象。

下面我们看一个原型设计模式的实例

package clone;
//浅克隆
//浅克隆:只复制引用,但不复制引用的对象。这样clone出来的多个对象指向的是同一个对象。复制引用
public class Person implements Cloneable{
	private int age;
	private int length;
	public Person(int age,int length) {
		this.age = age;
		this.length =length;
	}
	
	//抽象原型类object
	public Object clone() {
		try {
			return (Person)super.clone();
		} catch(Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
}

注意这一部分的代码的结果在测试类中没有给出输出

package clone;

public class Student implements Cloneable {

	int age;
	String name;

	Student(int age,String name ){
		this.age = age;
		this.name =name;
	}
	
	//抽象原型类object
	public Object clone() {
		Student o =new Student(12,name);
		try {
			 o = (Student)super.clone();
		}catch(Exception e) {
			e.printStackTrace();
		}
		return o;
	}
}

测试类

package clone;

public class Test {

	//private static final String leiyu = null;

	public static void main(String[] args) {
		// TODO 自动生成的方法存根

		Person person1 =new Person(12,12);
		Person person2 = (Person) person1.clone();
		System.out.println(person1.getClass()==person2.getClass());
		System.out.println(person1 == person2);
		System.out.println(person1.toString());
		System.out.println(person2.toString());
		//Student s1 = new Student(12,leiyu);
		//Student s2 = (Student) s1.clone();
		//System.out.println(s1.getClass()==s2.getClass());
	}

}

结果

关于clone方法的输出和测试
Java语言提供的clone()方法将对象复制一份返回给调用者。一般而言,clone()方法满足:
1.对任何的对象x,都有x.clone()!= x,即克隆的对象与原对象不是同一个对象。
2.对任何的对象x,都有x.clone().getclass()==x.getclass(),即克隆对象与原对象的类型一样。
3.如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该是成立的。

步骤归纳
为了获取对象的一份拷贝,我们可以利用Object类的clone()方法,具体步骤归纳如下:
1.在派生类中覆盖基类 的clone方法,并声明为public
2.在派生类中的clone()方法中返回super.clone()
3.在派生类中实现Cloneable接口
在Java语言中通过覆盖Object中的clone方法可以实现浅克隆,如果要实现深客隆,可以通过序列化等方式。

原型模式适合的情况
1.创建新对象的成本较大,新的对象可以通过原型模式对已有对象进行复制来获得。
2.系统要保存对象的状态,而对象的状态变化很小。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务