手机最全的网站,北京网站推广排名,公司系统软件,在百度上做网站推广怎么弄JAVA设计模式(三)-原型
本篇文章主要讲下java 创建型设计模式中的原型模式.
何谓原型模式: 简单来说就是 将一个对象作为原型#xff0c;通过对其进行复制而克隆出多个和原型类似的新实例。
使用原型模式,就可以简化实例化的过程, 不必依赖于构造函数或者new关键字.
由于j…JAVA设计模式(三)-原型
本篇文章主要讲下java 创建型设计模式中的原型模式.
何谓原型模式: 简单来说就是 将一个对象作为原型通过对其进行复制而克隆出多个和原型类似的新实例。
使用原型模式,就可以简化实例化的过程, 不必依赖于构造函数或者new关键字.
由于java 提供了clone方法, 原型设计模式的实现就很简单了.
原型模式的要素:
原型接口(Prototype Interface): 定义了克隆方法的接口.该方法用于复制现有对象并创建新对象。原型类(Concrete Prototype Class): 实现了克隆方法,来复制自身
1: 原型类
具体的实现如下:
package com.zh.xpose;import java.util.List;/*** Author: zh* Time: 23-12-22.* Email:* Describe:*/
public class ConcretePrototype implements Cloneable{private String name;private ListString fields;public ConcretePrototype(String name,ListString fields) {System.out.println(原型创建成功);this.name name;this.fields fields;}public String getName() {return name;}public void setName(String name) {this.name name;}public ListString getFields() {return fields;}public void setFields(ListString fields) {this.fields fields;}Overrideprotected Object clone() throws CloneNotSupportedException {System.out.println(原型复制成功);return (ConcretePrototype)super.clone();}
}
public class JavaTest {public static void main(String[] args) { ArrayListString list new ArrayList();list.add(age);list.add(sex);ConcretePrototype concretePrototype new ConcretePrototype(person,list);ConcretePrototype clone null;try {clone (ConcretePrototype) concretePrototype.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}System.out.println(concretePrototypeclone);System.out.println(concretePrototype.getName() clone.getName());System.out.println(concretePrototype.getFields() clone.getFields());}
}输出如下:
exclude patterns:
原型创建成功
原型复制成功
false
true
true2: 浅克隆和深克隆
浅克隆只会复制原型对象本身而不会复制它所引用的对象。也就是说克隆对象和原型对象会共享引用对象。如果原型对象中的引用对象发生改变克隆对象中的引用对象也会发生改变。
深克隆会复制原型对象以及它所引用的对象。也就是说克隆对象和原型对象拥有各自独立的引用对象。无论原型对象中的引用对象是否发生改变克隆对象中的引用对象都不会受到影响。
关于浅克隆:
验证如下: concretePrototype.setName(test111);list.add(第三个了);concretePrototype.setFields(list);System.out.println(concretePrototype.getName() clone.getName());System.out.println(concretePrototype.getFields().size() clone.getFields().size());可以看到 当原型类中的list 发生变更时, clone同时发生了变更.
test111 person
3 3实现深克隆的方式有两种: 通过实现Cloneable接口和通过序列化.
这里通过修改上面的实现类中的clone方法,来实现深克隆.
package com.zh.xpose;import java.util.ArrayList;
import java.util.List;/*** Author: zh* Time: 23-12-22.* Email:* Describe:*/
public class ConcretePrototype implements Cloneable{private String name;private ListString fields;public ConcretePrototype(String name,ListString fields) {System.out.println(原型创建成功);this.name name;this.fields fields;}public String getName() {return name;}public void setName(String name) {this.name name;}public ListString getFields() {return fields;}public void setFields(ListString fields) {this.fields fields;}Overrideprotected Object clone() throws CloneNotSupportedException {System.out.println(原型复制成功);ConcretePrototype clone (ConcretePrototype) super.clone();clone.setName(new String(name));clone.setFields(new ArrayList(fields));return clone;}
}重新执行验证代码 ,结果输出如下:
原型创建成功
原型复制成功
false
false
false
test111 person
3 2