一、克隆羊问题
现在有一只羊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 }