原型模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。即使用拷贝创建新的对象。
适用场景:类初始化需要消耗很多资源的时候。一个对象需要提供给多个其他对象访问,而且每个访问者都可能修改其值的时候。
注意事项:1.拷贝时,构造方法不会被执行。
2.拷贝时,不会拷贝可变的成员引用对象。(比如List)
3.拷贝的属性不能是final的
具体实现(pattern):直接
通用实现
1.创建一个可拷贝对象类,这里用猫
/**
* 使用原型模式的类需要实现Cloneable接口,该接口仅仅是一个标志
* 重写的clone方法是从Object继承来的
*/
public class Cat implements Cloneable{
public Cat(){
System.out.println("一只猫出生了。。。");
}
public void eat(){
System.out.println("这只猫开始吃东西了....");
}
/**
* 重写clone,拷贝一个对象返回
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Cat clone() throws CloneNotSupportedException {
Cat cat = null;
cat = (Cat) super.clone();
return cat;
}
}
2.创建场景测试类
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Cat cat =new Cat();
Cat clone = cat.clone();
cat.eat();
clone.eat();
}
}
浅度拷贝(即直接拷贝,不会拷贝对象里面的可变的引用对象)
1.修改被拷贝类(猫类),添加一个List集合
/**
* 使用原型模式的类需要实现Cloneable接口,该接口仅仅是一个标志
* 重写的clone方法是从Object继承来的
*/
public class Cat implements Cloneable{
//猫喜欢吃的食物
private List<String> list = new ArrayList<>();
public Cat(){
System.out.println("一只猫出生了。。。");
}
public void eat(){
System.out.println("这只猫开始吃东西了....");
}
/**
* 重写clone,拷贝一个对象返回
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Cat clone() throws CloneNotSupportedException {
Cat cat = null;
cat = (Cat) super.clone();
return cat;
}
public void setList(String eat) {
this.list.add(eat);
}
public List<String> getList() {
return list;
}
}
2.修改场景类
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Cat cat =new Cat();
Cat clone = cat.clone();
cat.setList("鱼");
clone.setList("猫粮");
System.out.println(cat.getList());
}
}
深度拷贝(独立的拷贝引用变量)
1.修改被拷贝类(猫类)
/**
* 使用原型模式的类需要实现Cloneable接口,该接口仅仅是一个标志
* 重写的clone方法是从Object继承来的
*/
public class Cat implements Cloneable{
//猫喜欢吃的食物
private ArrayList<String> list = new ArrayList<>();
public Cat(){
System.out.println("一只猫出生了。。。");
}
public void eat(){
System.out.println("这只猫开始吃东西了....");
}
/**
* 重写clone,拷贝一个对象返回
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Cat clone() throws CloneNotSupportedException {
Cat cat = null;
cat = (Cat) super.clone();
//独立拷贝成员变量
cat.list= (ArrayList<String>) this.list.clone();
return cat;
}