原型模式

2020-06-22  本文已影响0人  nieniemin

什么是原型模式

(Prototype) 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
用于创建重复的对象,同时又能保证性能。

需要注意: 使用Object中的clone()方法拷贝对象的时候,对于对象内部的数组、引用对象等都不拷贝,还是指向被拷贝对象中引用所在的地址,这种拷贝叫做浅拷贝。对于非基本数据类型的数据如list,map等拷贝则需要深拷贝,所谓深拷贝就是对于那些只是拷贝引用而不拷贝对象的属性进行单独拷贝

模式角色

1.原型类(Sheep克隆羊):原型类,声明一个克隆自己的接口
2.具体原型类(ConcretePrototype1,ShaunTheSheep):实现一个克隆自身的操作

UML类图

image.png

代码实现

public interface Sheep extends Cloneable {

    public Sheep createClone();

}
public class ShaunTheSheep implements Sheep {

    private String sheepName;

    private String sheepColor;




    @Override
    public Sheep createClone() {
        Sheep sheep = null;

        try {
            sheep = (Sheep)clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return sheep;
    }

    public String getSheepName() {
        return sheepName;
    }

    public void setSheepName(String sheepName) {
        this.sheepName = sheepName;
    }

    public String getSheepColor() {
        return sheepColor;
    }

    public void setSheepColor(String sheepColor) {
        this.sheepColor = sheepColor;
    }

    public ShaunTheSheep(String sheepName,
                         String sheepColor) {
        this.sheepName = sheepName;
        this.sheepColor = sheepColor;
    }

    @Override
    public String toString() {
        return "ShaunTheSheep{" +
                "sheepName='" + sheepName + '\'' +
                ", sheepColor='" + sheepColor + '\'' +
                '}';
    }
}
public class Client {

    public static void main(String[] args) {
        Sheep sheep = new ShaunTheSheep("小羊肖恩", "黑色");

        Sheep sheepClone = sheep.createClone();

        System.out.println(sheepClone); //ShaunTheSheep{sheepName='小羊肖恩', sheepColor='黑色'}
        System.out.println(sheep); //ShaunTheSheep{sheepName='小羊肖恩', sheepColor='黑色'}

    }
}

优点
一般在初始化的信息不发生变化的情况下,克隆是最好的办法,即隐藏了对象创建的细节,又对性能是大大的提供。
缺点
深拷贝和浅拷贝的使用需要事先考虑周到。否则很容易出现错误。

原型模式完整代码

上一篇下一篇

猜你喜欢

热点阅读