原型模式(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)设计模式

ProtoType(原型)-对象创建型模式

8创建型模式之原型模式

"围观"设计模式(10)--创建型之原型模式(Prototype Pattern)

原型模式(Prototype)

Prototype原型模式