一、克隆羊问题

  现在有一只羊tom, 姓名为: tom, 年龄为: 1, 颜色为:白色,请编写程序创建和tom羊 属性完全相同的10只羊。

二、传统方式实现

  1、代码实现

    Sheep类:

 1 public class Sheep {
 2 
 3     private String name;
 4     private int age;
 5     private String color;
 6 
 7     public Sheep() {
 8     }
 9 
10     public Sheep(String name, int age, String color) {
11         this.name = name;
12         this.age = age;
13         this.color = color;
14     }
15 
16     public String getName() {
17         return name;
18     }
19 
20     public void setName(String name) {
21         this.name = name;
22     }
23 
24     public int getAge() {
25         return age;
26     }
27 
28     public void setAge(int age) {
29         this.age = age;
30     }
31 
32     public String getColor() {
33         return color;
34     }
35 
36     public void setColor(String color) {
37         this.color = color;
38     }
39 
40     @Override
41     public String toString() {
42         return "Sheep{" +
43                 "name='" + name + '\'' +
44                 ", age=" + age +
45                 ", color='" + color + '\'' +
46                 '}';
47     }
48 }

 

    客户端:

 1 /**
 2  * 传统方法实现
 3  */
 4 public class Client {
 5     public static void main(String[] args) {
 6         Sheep sheep = new Sheep("Tom", 1, "白色");
 7         Sheep[] sheeps = new Sheep[10];
 8         for (int i = 0; i < 10; i++) {
 9             sheeps[i] = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
10             System.out.println(sheeps[i]);
11         }
12     }
13 }

 

 

  2、分析优缺点

    (1)优点是比较好理解,简单易操作;

    (2)在创建新的对象时,总是需要重新获取原始对象的属性,如果创建的对象比较复杂,效率较低;

    (3)总是需要重新初始化对象,而不是动态地获得对象运行时的状态,不够灵活;

  3、改进的思路分析

    Java 中 Object 类是所有类的根类,Object 类提供了一个 clone() 方法,该方法可以将一个 Java 对象复制一份,但是需要实现 clone 的 Java 类必须要实现一个接口 Cloneable,该接口表示该类能够复制且具有复制的能力 =》原型模式

三、原型模式

   1、基本介绍

    (1)原型模式(ProtoType模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象;

    (2)原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节;

    (3)工作原理:通过一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即 对象.clone()

  2、原型模式原理结构图:

    

 

     (1)ProtoType:原型类,声明一个克隆自己的接口;

     (2)ConcretePrototype:具体的原型类,实现一个克隆自己的操作;

     (3)Client 让一个原型对象克隆自己,从而创建一个新的对象/属性;

 

四、使用原型模式解决克隆羊

   使用原型模式改进传统方式,让程序具有更好的效率和扩展性。

   Sheep类:

 1 public class Sheep implements Cloneable{
 2 
 3     private String name;
 4     private int age;
 5     private String color;
 6     private String address;
 7 
 8     public Sheep() {
 9     }
10 
11     public Sheep(String name, int age, String color, String address) {
12         this.name = name;
13         this.age = age;
14         this.color = color;
15         this.address = address;
16     }
17 
18     public String getName() {
19         return name;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public int getAge() {
27         return age;
28     }
29 
30     public void setAge(int age) {
31         this.age = age;
32     }
33 
34     public String getColor() {
35         return color;
36     }
37 
38     public void setColor(String color) {
39         this.color = color;
40     }
41 
42     public String getAddress() {
43         return address;
44     }
45 
46     public void setAddress(String address) {
47         this.address = address;
48     }
49 
50     @Override
51     public String toString() {
52         return "Sheep{" +
53                 "name='" + name + '\'' +
54                 ", age=" + age +
55                 ", color='" + color + '\'' +
56                 ", address='" + address + '\'' +
57                 '}';
58     }
59 
60     /**
61      * 克隆该实例,使用默认的 clone 方法来完成
62      * @return
63      * @throws CloneNotSupportedException
64      */
65     @Override
66     protected Object clone() {
67         Sheep sheep = null;
68         try {
69             sheep = (Sheep)super.clone();
70         } catch (CloneNotSupportedException e) {
71             e.printStackTrace();
72             System.out.println(e.getMessage());
73         }
74         return sheep;
75     }
76 }

 

   客户端:

 1 public class Client {
 2 
 3     public static void main(String[] args) {
 4         System.out.println("原型模式完成对象的创建~~~");
 5         Sheep sheep = new Sheep("Tom", 1, "白色", "新疆");
 6 
 7         Sheep sheep2 = (Sheep)sheep.clone();
 8         Sheep sheep3 = (Sheep)sheep.clone();
 9         Sheep sheep4 = (Sheep)sheep.clone();
10         Sheep sheep5 = (Sheep)sheep.clone();
11 
12         System.out.println(sheep2);
13         System.out.println(sheep3);
14         System.out.println(sheep4);
15         System.out.println(sheep5);
16     }
17 }

 

 

 

posted on 2021-01-06 21:29  格物致知_Tony  阅读(155)  评论(0编辑  收藏  举报