原型模式

1、定义

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

2、使用场景

1) 类初始化需要消耗比较多的资源
2) 通过new产生一个对象需要非常繁琐的数据准备或访问权限
3) 一个对象需要提供给其它对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

3、类图


原型模式主要用于对象的复制,它的核心就是上图中的Prototype,Prototype需要具备以下两个条件:
1、实现Cloneable接口。
2、重写Object类中的clone方法。
clone方法并不是Cloneable接口中的,而是Object中的方法。Cloneable也是一个标示接口,它在运行时通知虚拟机这个类的对象是可拷贝的
Prototype类
class Prototype implements Cloneable { 
	private ArrayList<?> list = new ArrayList<Object>();
    public Prototype clone(){ 
        Prototype prototype = null; 
        try{ 
            prototype = (Prototype)super.clone(); 
            prototype.list = (ArrayList<?>) this.list.clone(); 
        }catch(CloneNotSupportedException e){ 
            e.printStackTrace(); 
        } 
        return prototype;  
    } 
}
ConcretePrototype类
public class ConcretePrototype extends Prototype {
	public void show(){ 
        System.out.println("原型模式实现类"); 
    } 
}
client类
public class Client { 
    public static void main(String[] args){ 
        ConcretePrototype cp = new ConcretePrototype(); 
        for(int i=0; i< 10; i++){ 
            ConcretePrototype clonecp = (ConcretePrototype)cp.clone(); 
            clonecp.show(); 
        } 
    } 
}

4、优缺点

优点:原型模式是对内存中二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时。
缺点:优点也是缺点,直接内存中拷贝,构造函数是不会执行的,实际开发中会存在潜在的问题,需要注意

5、注意事项

1)深拷贝与浅拷贝的问题:
Object类的clone方法只会拷贝对象中的
8种基本的数据类型(boolean, byte, char, short,  int, long, float, double)以及他们的封装类型(Boolean, Byte, Character, Short, Integer, Long, Float, Double)
另外还有String类型。
其余的都是浅拷贝。
如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象(引用对象的引用在栈中创建,但是对象在堆中创建,浅拷贝其实是不同的引用指向的同一块堆内存)等另行拷贝
2)保护性拷贝
某个对象对外可能是只读的,为了防止外部对这个只读对象修改,通常可以通过返回一个对象拷贝的形式实现只读的限制。

参考链接:
《Android源码设计模式解析与实战》






发布了97 篇原创文章 · 获赞 87 · 访问量 32万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览