设计模式-原型模式

来源:互联网 发布:javascript生成随机数 编辑:程序博客网 时间:2024/04/30 09:48

原型模式是通过现有对象创建一个或者多个同类型的新的对象。原型模式是一种对象创建型模式。

原型模式通过拷贝方法创建对象,这些对象都是全新的对象,它们在内存中拥有全新的地址,通常对拷贝所产生的对象进行修改时,对原型对象不会有任何影响,并且每个对象都是独立的,互不影响。在原型模式中包含三个角色:A,Prototype(抽象原型类):这是声明拷贝方法的接口,是所有具体原型类的公共父接口,可以是抽象类,接口,甚至具体实现类。B,ConcretePrototype(具体原型类):实现抽象原型类中声明的拷贝方法,在拷贝方法中返回自己的一个拷贝对象。C,Client(客户类):在客户类中,只需实例化或者通过工厂方法创建一个原型对象,在通过调用该对象的拷贝方法,即可得到多个相同的对象。原型模式的核心是:如何实现拷贝方法Java语言中常用的实现拷贝的方法:(1)通用实现法:
class ConcretePrototype implements Prototype{        private String str;//成员变量        public void setStr(String str){            this.str = str;        }        public String getStr(){            return str;        }        //拷贝方法        public Prototype clone(){            Prototype newOne = new ConcretePrototype();            newOne.setStr(this.str);            return newOne;        }    }    //在客户类中只需做如下实现:    class Cilent{        public static void main(String[] args){            Prototype one = new ConcretePrototype();            one.setStr("我会分身术!");            Prototype two = one.clone();        }    }
(2)java语言本身类库提供的clone()方法,但需要注意的是:原型对象必须实现标识接口Cloneable,表示支持被复制,否则,抛不支持克隆异常。Java语言原型模式中,有浅拷贝和深度拷贝两种方式。(1)浅拷贝:拷贝对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用仍然指向原先引用的对象。也就是浅拷贝只考虑原对象本身,不考虑原对象的引用对象。Java的clone方法即浅拷贝。(2)深度拷贝:深度拷贝不仅拷贝原有对象本身,同时拷贝原对象的引用对象,新拷贝的对象不在引用原对象引用的对象,而是引用新拷贝的对象。对引用对象的拷贝成为简接拷贝。上述两种拷贝实现均为浅拷贝的实现。在java中,要实现深度拷贝可以通过序列化等方式实现。需要注意的是:需要序列化的对象必须实现Serializable接口,否则无法序列化。例如:
//原型对象:附件类    class Attachment implements Serializable{        private String name;        public void setName(String name){            this.name = name;        }        public String getName(){            return name;        }        public void download(){            System.out.println("下载附件,附件名为:"+name);        }    }    //原型对象:工作月报类    class MonthLog implements Serializable{        private Attachment attachment;        private String name;        private String date;        private String content;        public void setAttachment(Attachment attachment){            this.attachment = attachment;        }        public void setName(String name){            this.name = name;        }        public void setDate(String date){            this.date = date;        }        public void setContent(String content){            this.content = content;        }        public Attachment getAttachment(){            return attachment;        }        public String getName(){            return name;        }        public String getDate(){            return date;        }        public String getContent(){            return content;        }        //使用序列化技术实现深度拷贝        public MonthLog deepCopy()throws Exception{            //将对象写入流中            ByteArrayOutputStream bao = new ByteArrayOutputStream();            ObjectOutputStream oos = new ObjectOutputStream(bao);            oos.writeObject(this);            //将对象从流中读出            ByteArrayInputStream bai = new ByteArrayInputStream(bao.toByteArray());            ObjectInputStream ois = new ObjectInputStream(bai);            return (MonthLog)ois.readObject();        }    }
原型模式的总结:(1)性能优良:原型模式是内存二进制的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内要产生大量对象的情况下(2)逃避构造函数的约束:是优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,优点减少了约束,缺点同样如是。原型模式的使用场景:(1)资源优化场景:类初始化需要消耗非常多的资源,这个资源包裹数据,硬件等资源。(2)性能和安全要求的场景:通过new一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。(3)一个对象多个使用者切需要修改的场景。注:(1)Object类的clone方法的原理是直接从内存中以二进制流的方式进行拷贝重新分配一个内存块,构造函数是不执行的。(2)clone方法所从的内存是堆内存,而堆内存中存放的是基本类型的数据或者是对其他对象的引用,所以:它只能实现浅拷贝。
0 0
原创粉丝点击