属于创建型模式
针对批量对象的创建。
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
原型模式将克隆过程委派给被克隆的对象。即由被克隆的对象负责自己的克隆。
比如你现在有一个女朋友,你觉得不够用,你还想再要一个,一个陪你玩,一个给你做家务,那么你就可以通过原型模式来复制多个女朋友。
创建一个接口,里面写复制的方法。
package com.qing.clone;
public interface IYuanxing {
Object copy();
}
女朋友类写一个构造方法,参数传要复制的女朋友。
女朋友类实现接口,重写复制的方法(new 一个女朋友对象,参数传女朋友自己,return)。
女朋友类里复制的属性不要写set方法,就只get就行。
package com.qing.clone;
public class GirlFriend implements IYuanxing{
private String face;
private String body;
//参数是要复制的女朋友
public GirlFriend(GirlFriend girlFriend) {
this.face = girlFriend.face;
this.body = girlFriend.body;
}
public GirlFriend() {
}
public GirlFriend(String face, String body) {
this.face = face;
this.body = body;
}
public String getFace() {
return face;
}
public String getBody() {
return body;
}
//copy方法,复制自己
@Override
public Object copy() {
return new GirlFriend(this);
}
}
测试
package com.qing.clone;
public class Test1 {
public static void main(String[] args) {
GirlFriend girlFriend1 = new GirlFriend("圆脸","身材匀称");
System.out.println(girlFriend1.getFace()+" "+girlFriend1.getBody());
GirlFriend girlFriend2 = new GirlFriend(girlFriend1);
System.out.println(girlFriend2.getFace()+" "+girlFriend2.getBody());
System.out.println(girlFriend1);
System.out.println(girlFriend2);
}
}
然后你就得到了两个一样长相的的女朋友,她两还不是同一个。
接下来,你觉得女盆友多了得区分一下,她们的长相可以一样,名字要区分开。
重写复制的方法还和之前一样,但是因为名字要区分,名字单独添加了set方法
package com.qing.clone;
public class GirlFriendNameDiff implements IYuanxing {
private String face;
private String body;
private String name;
//参数是要复制的女朋友,复制 脸 和 身材
//名字不复制,名字要不一样
public GirlFriendNameDiff(GirlFriendNameDiff girlFriend) {
this.face = girlFriend.face;
this.body = girlFriend.body;
}
public GirlFriendNameDiff(String face, String body) {
this.face = face;
this.body = body;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFace() {
return face;
}
public String getBody() {
return body;
}
//copy方法,复制自己
@Override
public Object copy() {
return new GirlFriendNameDiff(this);
}
@Override
public String toString() {
return "GirlFriendNameDiff{" +
"face='" + face + '\'' +
", body='" + body + '\'' +
", name='" + name + '\'' +
'}';
}
}
测试看一下
@Test
void test1() {
GirlFriendNameDiff girlFriend1 = new GirlFriendNameDiff("鹅蛋脸","苗条");
girlFriend1.setName("小美");
GirlFriendNameDiff girlFriend2 = new GirlFriendNameDiff(girlFriend1);
girlFriend2.setName("小红");
GirlFriendNameDiff girlFriend3 = new GirlFriendNameDiff(girlFriend1);
girlFriend3.setName("小可");
System.out.println(girlFriend1);
System.out.println(girlFriend2);
System.out.println(girlFriend3);
}
得到了长相一样,名字不一样的女朋友