原型模式(Prototype)-创建型(Creational)设计模式
Posted TaylorLambert
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原型模式(Prototype)-创建型(Creational)设计模式相关的知识,希望对你有一定的参考价值。
今天早上起床,突然脑子里面想起来,AbstractBeanDefinition试下了Clonable接口,Spring里面是使用了原型模式
现在一看代码,发现还真是有,所以就记录下来。
org.springframework.beans.factory.support.AbstractBeanDefinition的代码
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor implements BeanDefinition, Cloneable @Override public Object clone() return cloneBeanDefinition(); public abstract AbstractBeanDefinition cloneBeanDefinition(); /** * *实现的深克隆 */ protected AbstractBeanDefinition(BeanDefinition original) setParentName(original.getParentName()); setBeanClassName(original.getBeanClassName()); setScope(original.getScope()); setAbstract(original.isAbstract()); setFactoryBeanName(original.getFactoryBeanName()); setFactoryMethodName(original.getFactoryMethodName()); setRole(original.getRole()); setSource(original.getSource()); copyAttributesFrom(original); if (original instanceof AbstractBeanDefinition) AbstractBeanDefinition originalAbd = (AbstractBeanDefinition) original; if (originalAbd.hasBeanClass()) setBeanClass(originalAbd.getBeanClass()); if (originalAbd.hasConstructorArgumentValues()) setConstructorArgumentValues(new ConstructorArgumentValues(original.getConstructorArgumentValues())); if (originalAbd.hasPropertyValues()) setPropertyValues(new MutablePropertyValues(original.getPropertyValues())); if (originalAbd.hasMethodOverrides()) setMethodOverrides(new MethodOverrides(originalAbd.getMethodOverrides())); Boolean lazyInit = originalAbd.getLazyInit(); if (lazyInit != null) setLazyInit(lazyInit); setAutowireMode(originalAbd.getAutowireMode()); setDependencyCheck(originalAbd.getDependencyCheck()); setDependsOn(originalAbd.getDependsOn()); setAutowireCandidate(originalAbd.isAutowireCandidate()); setPrimary(originalAbd.isPrimary()); copyQualifiersFrom(originalAbd); setInstanceSupplier(originalAbd.getInstanceSupplier()); setNonPublicAccessAllowed(originalAbd.isNonPublicAccessAllowed()); setLenientConstructorResolution(originalAbd.isLenientConstructorResolution()); setInitMethodName(originalAbd.getInitMethodName()); setEnforceInitMethod(originalAbd.isEnforceInitMethod()); setDestroyMethodName(originalAbd.getDestroyMethodName()); setEnforceDestroyMethod(originalAbd.isEnforceDestroyMethod()); setSynthetic(originalAbd.isSynthetic()); setResource(originalAbd.getResource()); else setConstructorArgumentValues(new ConstructorArgumentValues(original.getConstructorArgumentValues())); setPropertyValues(new MutablePropertyValues(original.getPropertyValues())); setLazyInit(original.isLazyInit()); setResourceDescription(original.getResourceDescription());
AbstractBeanDefinition的子类实现就是调用,AbstractBeanDefinition里面的#AbstractBeanDefinition(BeanDefinition original)实现深克隆
看看org.springframework.beans.factory.support.GenericBeanDefinition的实现方法
public GenericBeanDefinition(BeanDefinition original) super(original);
-------------------------------------------------------------------
现在说说本场主角,原型模式,分为:浅克隆、深克隆
浅克隆:简单的说,就是只克隆基本属性,对象属性没有进行克隆,用的还是同一个,当对象属性改变,所有的基于浅克隆的对象属性值就都改变了
深克隆:简单的说,就是对象属性也进行克隆
简单代码实现:
以上是关于原型模式(Prototype)-创建型(Creational)设计模式的主要内容,如果未能解决你的问题,请参考以下文章
原型模式(Prototype)-创建型(Creational)设计模式