原型模式小试(一)

2014-11-23 21:59:38 · 作者: · 浏览: 4
同为创建型模式的原型模式与单例模式是密不可分的,这也是最常用的设计模式之一。
原型模式是一种非常简单的设计模式。这里除了基本介绍和演示,还详细介绍了 Java中原型模式的本质。
一、介绍
  同样,先来看一下《研磨设计模式》的定义——用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
  原型模式的本质——克隆生成对象。
  那么原型模式是什么意思呢?说白了就是克隆自身。我们知道Java中没有引用这个概念,Java用变量名代表引用。像 Apple a = new Apple(); 我们知道,想要操作这个Apple对象,那么就是去操作"a"这个变量名,实质就是去操作“a”这个引用所指向的内存地址上的Apple对象。通常而言,赋值操作符“=”的本质就是将“=”右边的地址赋值给左边的引用。如果我们希望创建一个跟这个对象a一样的Apple对象,同时在操作这个新对象的时候,对象a无任何影响。Java新手可能下意识觉得使用Apple b = a; 很明显a和b指向的是同一片内存空间。
  原型模式就是为了解决这样的对象复制的问题。
  Java中的原型模式实现起来其实很简单,在对象的接口中添加一个复制自身的抽象方法,然后对象实现这个方法,复制自身即可。使用的时候直接调用接口方法即可。
二、我的实现
1、我们有一个水果接口,如下:
复制代码
1 public interface Fruit {
2
3 public double getPrice();
4
5 public void setPrice(double price);
6
7 //克隆接口
8 public Fruit cloneFruit();
9 }
复制代码
2、一个简单实现类:
复制代码
1 public class Apple implements Fruit,Cloneable {
2
3 // 价格
4 private double price;
5 // 平均尺寸
6 private double avgSize;
7 // 产地
8 private String productionArea;
9
10 public Apple(double price, double avgSize, String productionArea) {
11 super();
12 this.price = price;
13 this.avgSize = avgSize;
14 this.productionArea = productionArea;
15 }
16
17 public double getAvgSize() {
18 return avgSize;
19 }
20
21 public void setAvgSize(double avgSize) {
22 this.avgSize = avgSize;
23 }
24
25 public String getProductionArea() {
26 return productionArea;
27 }
28
29 public void setProductionArea(String productionArea) {
30 this.productionArea = productionArea;
31 }
32
33 @Override
34 public void setPrice(double price) {
35 // TODO Auto-generated method stub
36 this.price = price;
37 }
38
39 @Override
40 public double getPrice() {
41 // TODO Auto-generated method stub
42 return price;
43 }
44
45 @Override
46 public String toString() {
47 return "Apple [avgSize=" + avgSize + ", price=" + price
48 + ", productionArea=" + productionArea + "]";
49 }
50
51 //克隆自身的实现
52 @Override
53 public Fruit cloneFruit()
54 {
55 return new Apple(price, avgSize, productionArea);
56 }
57
58 }
复制代码
3、然后就可以测试了,如下:
复制代码
1 package prototype.myPrototype;
2
3 public class Client {
4
5 public static void main(String[] args)
6 {
7 Fruit fruit = new Apple(1,2,"红富士");
8 System.out.println(fruit);
9
10 //根据原对象克隆
11 Fruit cloneFruit = fruit.cloneFruit();
12 System.out.println(cloneFruit);
13 System.out.println("两个水果是同一个吗?"+(fruit==cloneFruit));
14
15 }
16 }
复制代码
4、结果如下:
Apple [avgSize=2.0, price=1.0, productionArea=红富士]
Apple [avgSize=2.0, price=1.0, productionArea=红富士]
两个水果是同一个吗?false
如上,简单的实现了原型模式。也实现了接口与实现分离的克隆。在完全不知道对象类型的情况下完成了复制。
三、Java的原型模式(Object的clone()方法)
(1)、介绍
  Object类有一个clone()方法,这是java为实现原型模式准备的。
  要实现Java的克隆方法,要满足三个条件:
  1、调用对象实现了cloneable接口
  2、调用对象重写了public Object clone();方法。
  3、重写clone()时,调用super.clone();
  我们来看一下clone方法的原型
  protect