设计模式学习-原型模式

       原型模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用原型模式创建的实例,具有与原型一样的数据。原型模式可以看作原型对象对自身的一个克隆。根据对象克隆深度层次的不同,有浅度克隆与深度克隆。

       下面看原型模式结构图(摘自 程杰 大话设计模式)

下面利用java实现原型模式

public class Person implements Cloneable{
	// 姓名
	private String name;
	// 年龄
	private int age;
	// 性别
	private String sex;
	//朋友
	private List<String> friends;

	public List<String> getFriends() {
		return friends;
	}

	public void setFriends(List<String> friends) {
		this.friends = friends;
	}

	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 Person clone() {
		try {
			Person person  = (Person)super.clone();
			List<String> newfriends = new ArrayList<String>();
			for(String friend : this.getFriends()) {
				newfriends.add(friend);
			}
			person.setFriends(newfriends);
			return  person;
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
			return null;
		}
	}

}

      Person 实现 Cloneable接口,声明一个克隆自身的接口。实现 clone() 方法。实现Cloneable接口后 调用 Objecte的clone()方法,可以实现浅度克隆,浅度克隆指的是 只复制了值类型的字段属性,对于引用类的字段属性,复制引用但不复制引用的对象。原始对象与副本引用同一对象。如例子中的 List<String> friends ,所以要实现深复制只能自己动手在方法clone中实现。

下面是执行

public class MainClass {
	public static void main(String[] args) {
		Person person1 = new Person();
		List<String> friends = new ArrayList<String>();
		friends.add("James");
		friends.add("Yao");
		
		person1.setFriends(friends);
		
		Person person2 = person1.clone();
		
		System.out.println(person1.getFriends());
		System.out.println(person2.getFriends());
		
		friends.add("Mike");
		person1.setFriends(friends);
		System.out.println(person1.getFriends());
		System.out.println(person2.getFriends());
	}
}

对于原型模式一定要把握复制的层数,若是层数越多,就越复杂。

发布了73 篇原创文章 · 获赞 78 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/SHIYUN123zw/article/details/84729021
今日推荐