属于创建型模式
针对批量对象的创建。
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
原型模式将克隆过程委派给被克隆的对象。即由被克隆的对象负责自己的克隆。
比如你现在有一个女朋友,你觉得不够用,你还想再要一个,一个陪你玩,一个给你做家务,那么你就可以通过原型模式来复制多个女朋友。
创建一个接口,里面写复制的方法。
- 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);
- }
得到了长相一样,名字不一样的女朋友