设计模式----原型模式

一、模式定义

  所谓原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

  能够克隆的类需要实现Cloneable接口,且提供clone()接口。

  当通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。

  其中克隆又分为:

      深克隆:

        1.普通实现

        2.利用序列化和反序列化实现

      浅克隆。

二、代码实现

  其中Sheep为能够被克隆的类

 1 import java.io.Serializable;
 2 import java.util.Date;
 3 
 4 public class Sheep implements Cloneable,Serializable{
 5     private String sname;
 6     private Date birthday;
 7     
 8     @Override
 9     protected Object clone() throws CloneNotSupportedException {
10         // TODO Auto-generated method stub
11         Object obj = super.clone();
12         
13         return obj;
14     }
15     
16     public Sheep() {
17         super();
18     }
19 
20 
21 
22     public String getSname() {
23         return sname;
24     }
25 
26 
27 
28     public void setSname(String sname) {
29         this.sname = sname;
30     }
31 
32 
33 
34     public Date getBirthday() {
35         return birthday;
36     }
37 
38 
39 
40     public void setBirthday(Date birthday) {
41         this.birthday = birthday;
42     }
43 
44 
45 
46     public Sheep(String sname, Date birthday) {
47         super();
48         this.sname = sname;
49         this.birthday = birthday;
50     }
51 }

下面为使用过程:

 1 public class Client4 {
 2     public static void main(String[] args) throws CloneNotSupportedException {
 3         testNew(100);
 4         testClone(100);
 5     }
 6 
 7     public static void testNew(int size){
 8         long start = System.currentTimeMillis();
 9         for(int i=0;i<size;i++){
10             Laptop t = new Laptop();
11         }
12         long end = System.currentTimeMillis();
13         System.out.println("以new的方式创建耗时:"+(end-start));
14     }
15     
16     public static void testClone(int size) throws CloneNotSupportedException{
17         long start = System.currentTimeMillis();
18         Laptop t = new Laptop();
19         for(int i=0;i<size;i++){
20             Laptop temp = (Laptop)t.clone();
21         }
22         long end = System.currentTimeMillis();
23         System.out.println("以Clone的方式创建耗时:"+(end-start));
24     }
25 }
26 
27 class Laptop implements Cloneable{
28     public Laptop(){
29         try {
30             Thread.sleep(10);
31         } catch (InterruptedException e) {
32             // TODO Auto-generated catch block
33             e.printStackTrace();
34         }
35     }
36     
37     protected Object clone() throws CloneNotSupportedException{
38         Object obj = super.clone();
39         return obj;
40     }
41 }

结果如下:

可以看出,当new产生一个对象需要非常繁琐的数据准备或访问权限时,使用克隆可以大大的提高效率。

 

三、开发中的应用场景

  原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。

posted @ 2018-11-15 10:33  DXYE  阅读(128)  评论(0编辑  收藏  举报