原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。
原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。
原型模式的核心是一个clone()方法,通过该方法进行对象拷贝,Java提供了一个Clonnable接口来表示这个对象是可以拷贝的。方法是覆盖clone(),此方法每个类中都有,因为它是Java中所有类的老祖宗Object中的方法。
在进行对象拷贝的时候,该类的构造函数并没有执行,因为Object中的clone()方法的原理是从堆内存中以二进制流的方式进行拷贝,重新分配一个内存块,所以构造函数并不会被执行
例子:假设有一个person类.存在两个实例张三和李四,但是因为张三和李四有些属性是相像的。所以不用通过张三这个原型来copy出一个李四的实例
1. person类代码
import java.util.ArrayList; import java.util.List; public class Person implements Cloneable{ private String name; private int age; private char gender; private double height; private double weight; private ArrayList<String> readBooks = new ArrayList<String>();//读过的书 public Person() { System.out.println("构造--person--开始执行....."); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public List<String> getReadBooks() { return readBooks; } public void setReadBooks(String readBook) { this.readBooks.add(readBook); } public void sayHello() { System.out.println("my name :" + name + "--my age: " + age + "--my gender: " + gender + "--读过的书:" + this.readBooks); } @Override public Object clone() throws CloneNotSupportedException { Person person = null; person = (Person) super.clone(); return person; } }
2. 运行类
public class Main { public static void main(String[] args) throws CloneNotSupportedException { //实例化一个张三的对象 Person zhangsan = new Person(); zhangsan.setName("张三"); zhangsan.setAge(11); zhangsan.setGender('男'); //通过张三复制出来一个李四的对象 Person lisi = (Person) zhangsan.clone(); //修改一下名字 lisi.setName("李四"); //李四读过一本叫心理学的书 lisi.setReadBooks("心理学"); //张三的自我介绍 zhangsan.sayHello(); System.out.println("-----------------"); //李四的自我介绍 lisi.sayHello(); } }
运行结果:
构造--person--开始执行.....
my name :张三--my age: 11--my gender: 男--读过的书:[心理学]
-----------------
my name :李四--my age: 11--my gender: 男--读过的书:[心理学]
我们分析这个结果,发现构造函数只执行了一次,但是张三本来没有读过心理学的书,但程序执行的时候
发现,张三读过的书中有这个值。原因就是克隆时的深克隆和浅克隆。上面代码是浅克隆。
将clone()方法改成如下
public Object clone() throws CloneNotSupportedException { Person person = null; person = (Person) super.clone(); person.readBooks = (ArrayList<String>) this.readBooks.clone();//深度克隆 return person; }
再执行,结果如下:
构造--person--开始执行.....
my name :张三--my age: 11--my gender: 男--读过的书:[]
-----------------
my name :李四--my age: 11--my gender: 男--读过的书:[心理学]
这样就完全实现了两个对象间的隔离。
菜鸟,HY大神拍砖,共同进步,上次已经有大神拍了感激不尽。
相关推荐
java 23种设计模式之原型模式:用原型实例指定创建对象的种类,并通过复制、克隆这些原型创建新的对象。
该代码是android应用设计模式之原型模式小例子
该文档是根据博客园汤姆大叔的深入...42.设计模式之原型模式 43.设计模式之状态模式 44.设计模式之桥接模式 45.代码复用模式(避免篇) 46.代码复用模式(推荐篇) 47.对象创建模式(上篇) 48.对象创建模式(下篇)
iOS设计模式之原型模式 博客地址:http://blog.csdn.net/ioswyl88219/article/details/17662945
设计模式之原型模式的Java版本实现和UML类设计图
设计模式的原型模式的例子,希望对大家有用~~~~~~~~
设计模式_源代码大全.zip 包括:1.简单工厂模式 2.策略模式 3.装饰模式 4.代理模式 5.工厂方法模式 6.原型模式 7.模板方法模型 8.外观模式 9.建造者模式 10.观察者模式 11.抽象工厂模式 12.状态模式 13.适配器模式 ...
这个是http://blog.csdn.net/dawanganban/article/details/9900539博客中java设计模式的源代码。下载前请先看《设计模式——原型模式》一文。
iOS设计模式之原型设计模式
文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...
设计模式之禅之 原型模式 设计模式之禅之 原型模式 设计模式之禅之 原型模式设计模式之禅之 原型模式
Java 23种设计模式08原型模式.pdf
设计模式
java设计模式之原型模式,希望对大家有所帮助。
原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式...