美文网首页
设计模式-原型设计模式

设计模式-原型设计模式

作者: woochen123 | 来源:发表于2018-01-05 11:56 被阅读0次

    1.定义

    当多个地方需要修改某个对象的值或者属性,而重新new会消耗大量的资源(磁盘,硬件),这个时候可以考虑使用原型设计模式,通过拷贝对象来完成对象的复用

    2.分类

    浅拷贝:副本中的字段引用原始的字段(当字段是引用数据类型的时候,对拷贝的副本进行修改,会同时修改原始的字段)
    深拷贝:当原始字段是引用数据类型时,对该字段进行clone

    3.代码

    实体类

    /**
     *用户实体类
     *@author woochen123
     *@time 2018/1/5 11:24
     *@desc
     */
    public class User implements Cloneable{
        public int age;
        public String  name;
        public String phoneNum;
        public Address address;
    
        @Override
        protected User clone() {
            User user = null;
            try {
                user = (User) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return user;
        }
        
    }
    
    /**
     *用户地址类
     *@author woochen123
     *@time 2018/1/5 11:24
     *@desc
     */
    public class Address {
        public String city;
        public String distinct;
        public String street;
    
        public Address(String city, String distinct, String street) {
            this.city = city;
            this.distinct = distinct;
            this.street = street;
        }
    
    }
    

    操作层

    /**
     *登录接口
     *@author woochen123
     *@time 2018/1/5 11:26
     *@desc
     */
    public interface Login {
        void login();
    }
    
    /**
     *登录实体类
     *@author woochen123
     *@time 2018/1/5 11:27
     *@desc
     */
    public class LoginImpl implements Login {
        @Override
        public void login() {
            //登录到服务器获取用户信息
            User loginedUser = new User();
            //将服务器设置的用户信息设置给loginedUser对象
            loginedUser.age = 24;
            loginedUser.name = "woochen123";
            loginedUser.address = new Address("浙江","杭州","西湖区");
            //将登录用户保存到本地缓存
            LoginSession.getLoginSession().setLoginUser(loginedUser);
    
        }
    }
    

    数据存储

    /**
     * 登录缓存
     *
     * @author woochen123
     * @time 2018/1/5 11:35
     * @desc
     */
    public class LoginSession {
        private static LoginSession mLoginSession;
        User user;
    
        public static LoginSession getLoginSession() {
            if (mLoginSession == null) {
                mLoginSession = new LoginSession();
            }
            return mLoginSession;
        }
    
        void setLoginUser(User user) {
            //与登录模块不在一个包中的类将无法调用此方法
            this.user = user;
        }
    
        public User getLoginUser() {
            //在外部模块拿到的是克隆对象,不会对原始用户实体对象造成任何影响
            return user.clone();
        }
    
    }
    

    4.总结

    • 在进行拷贝操作的时候不会执行类的构造方法

    5.应用

    • 保护性拷贝(当某个对象对外需要只进行只读性操作时,可以通过对象拷贝进行只读的限制)

    相关文章

      网友评论

          本文标题:设计模式-原型设计模式

          本文链接:https://www.haomeiwen.com/subject/vbwjnxtx.html