zoukankan      html  css  js  c++  java
  • 原型模式【构建模式】

    原型模式

    Specify the kinds of objects to create using a prototypical instance,
    and create new objects by coping the prototype。
    通过原型实例指定创建对象的种类,并通过拷贝这个原型实例来创建新的对象。
    
    public class Prototype {
        /**
         * 原型模式:
         * Specify the kinds of objects to create using a prototypical instance,
         * and create new objects by coping the prototype。
         * 通过原型实例指定创建对象的种类,并通过拷贝这个原型实例来创建新的对象。
         */
        @Test
        public void testlone() throws CloneNotSupportedException {
            final User user = new User();
            user.setName("name");
    
            /**
             * clone 操作直接基于内存实现,不会调用构造函数,执行速度快,原型模式适合在创建大量的相同实例时使用。
             */
            final User clone = user.clone();
            assertEquals("name", clone.getName());
        }
    
        @Test
        public void shadowDeepCopy() throws CloneNotSupportedException {
            final List<String> alias = Lists.newArrayList();
            alias.add("first");
    
            final ShadowCopy shadowCopy = ShadowCopy.builder().alias(alias).build();
            final ShadowCopy clone = shadowCopy.clone();
            /**
             * 浅拷贝:对象属性直接引用原实例,修改克隆实例的此属性会影响原对象
             */
            clone.getAlias().add("second");
            assertEquals(shadowCopy.getAlias(), clone.getAlias());
    
            final DeepCopy deepCopy = DeepCopy.builder().alias(Arrays.asList("third")).build();
            final DeepCopy deepClone = deepCopy.clone();
            deepClone.getAlias().add("fourth");
    
            assertEquals(1, deepCopy.getAlias().size());
            assertEquals(2, deepClone.getAlias().size());
        }
    }
    
    @Data
    @Slf4j
    class User implements Cloneable {
        private String name;
    
        public User() {
            log.info("invoke constructor {}", getClass().getName());
        }
    
        @Override
        protected User clone() throws CloneNotSupportedException {
            return (User) super.clone();
        }
    }
    
    @Data
    @Builder
    class ShadowCopy implements Cloneable{
        private List<String> alias;
    
        @Override
        protected ShadowCopy clone() throws CloneNotSupportedException {
            return (ShadowCopy) super.clone();
        }
    }
    
    @Data
    @Builder
    class DeepCopy implements Cloneable{
        private List<String> alias;
    
        @Override
        protected DeepCopy clone() throws CloneNotSupportedException {
            final DeepCopy deepCopy = (DeepCopy) super.clone();
            /**
             * 重新设置 alias 属性的值:基于当前 alias 创建新的实例
             */
            deepCopy.setAlias(Lists.newArrayList(alias));
            return deepCopy;
        }
    }
    
  • 相关阅读:
    [原创]推荐三款强大且漂亮的统计图控件
    使用ATL设计组件(VC6.0)
    COM笔记引用计数
    远程调试
    记事本2
    C++中类的多态与虚函数的使用
    Eclipse常用快捷键
    怎么在Release下调试代码
    MSDN 无法显示网页
    COM笔记接口
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10163877.html
Copyright © 2011-2022 走看看