软件设计模式之原型模式

原型模式(Prototype)使用场景:
1):对象之间相同或相似,只有个别属性不同。
2):对象的创建过程比较麻烦,但是复制过程比较简单。

明白了使用场景让我们来看看什么是原型模式的定义,你大概或许猜到了一点,直白点就是复制原型对象创建一个和原型对象相同或者相似的对象。

模式的结构:原型对象包含了以下主要角色:
1):抽象原型类:规定了具体原型对象必须实现的的接口。
2):具体原型类:实现抽象原型类的clone()方法,它是一个可被复制的对象。
3):访问类:使用具体原型类中的clone()方法复制新的对象。

原型模式的结构图

接下来就是具体代码的实现:由于原型模式的克隆是分为浅克隆和深克隆。下面我们分别来看看两种克隆模式的实现。
创建接口
public interface Prototype {

Prototype clone();

}
创建具体的克隆对象
import java.util.List;

public class ConcretePrototypeA implements Prototype{

private int age;

private String name;

private List hobbies;

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public List getHobbies() {
    return hobbies;
}

public void setHobbies(List hobbies) {
    this.hobbies = hobbies;
}

@Override
public ConcretePrototypeA clone() {

    ConcretePrototypeA concretePrototype = new ConcretePrototypeA();

    concretePrototype.setAge(this.age);

    concretePrototype.setName(this.name);

    concretePrototype.setHobbies(this.hobbies);

    return concretePrototype;
}

}

3.创建Client接口
public class Client {

private Prototype prototype;

public Client(Prototype prototype){
    this.prototype=prototype;
}

public Prototype startClone(Prototype concretePrototype){
    return  (Prototype) concretePrototype.clone();
}

}

测试类
import java.util.ArrayList;
import java.util.List;

public class PrototypeTest {

public static void main(String[] args) {
    //创建一个具体的需要克隆的对象
    ConcretePrototypeA concretePrototype = new ConcretePrototypeA();
    //填充属性方便测试
    concretePrototype.setAge(15);

    concretePrototype.setName("lisi");

    List hobbies = new ArrayList<String>();

    concretePrototype.setHobbies(hobbies);

    System.out.println(concretePrototype);

    //创建client对象,准备开始克隆
    Client client = new Client(concretePrototype);

    ConcretePrototypeA concretePrototypeClone = (ConcretePrototypeA)
            client.startClone(concretePrototype);

    System.out.println(concretePrototypeClone);

    System.out.println("克隆对象中的引用类型地址值:" + concretePrototypeClone.getHobbies());
    System.out.println("原对象中的引用类型地址值:" + concretePrototype.getHobbies());
    System.out.println("对象地址比较:"+(concretePrototypeClone.getHobbies() ==
            concretePrototype.getHobbies()));
}

}

测试结果
2。看完了浅克隆,咋们再来看看深克隆,具体的代码实现点击下方的链接就可以查看嘞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值