设计模式 原型模式来复制女朋友

 属于创建型模式

针对批量对象的创建。


用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。


原型模式将克隆过程委派给被克隆的对象。即由被克隆的对象负责自己的克隆。

 

比如你现在有一个女朋友,你觉得不够用,你还想再要一个,一个陪你玩,一个给你做家务,那么你就可以通过原型模式来复制多个女朋友。

创建一个接口,里面写复制的方法。

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);
    }

得到了长相一样,名字不一样的女朋友

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值