【设计模式】原型模式

一、前言

设计模式系列(参考资料:《Android源码设计模式解析与实战》——何红辉、关爱明)
单例模式
Builder模式
原型模式


二、介绍

原型模式属于创建型模式,主要通过从一个现有实例拷贝出另外一个实例,从而实现两个实例互不影响(这是深拷贝,浅拷贝还是会有影响的)


三、UML图

在这里插入图片描述

这里有三个角色是因为面向接口,所以以多态的形式创建具体原型类ConcretePrototype,实际上接口Prototype选择性创建


四、使用场景

根据原型模式的特点——克隆,可以得出以下使用场景:

  • 1、因为clone方法不会调用构造函数,所以如果new一个对象代价太高(例如需要繁琐的数据准备、权限,或耗时较长),可以选择原型模式代替
  • 2、一个对象需要提供给其他对象使用,而且使用者有可能需要各自改变它们拿到的这个对象的值,这时候就不可以直接返回同一个对象了,因为这样会导致A使用者的修改同步到B使用者的对象

五、举例

场景:用户登录后生成一个用户信息记录,供其它类调用(不是修改)

用户记录类,setUser方法的级别为包级,也就限制了其他包调用该方法

	public class UserRecord {
	    private UserRecord mUserRecord = null;
	    private User mUser = null;
	
	    public UserRecord() {
	    }
	
	    //包级
	    void setUser(User user){
	        mUser = user;
	    }
	
	    public UserRecord getUserRecord(){
	        if (mUserRecord == null){
	            mUserRecord = new UserRecord();
	        }
	        return mUserRecord;
	    }
		
		//得到的并不是mUser,而是一个克隆对象
	    public User getUser() throws CloneNotSupportedException{
	        return (User) mUser.clone();
	    }
	}

User实体类,重写了clone方法,该方法返回一个User的克隆对象,这样就可以防止多个调用方对mUser进行修改,从而互相影响(这里注意TestObject,如果只clone了User对象,那是浅拷贝,如果要达到深拷贝,需要把它下面的所有引用数据类型,例如TestObject也通过clone拷贝)

	public class User implements Cloneable {
	    private int mId;
	    private String mName;
	    private TestObject mObject;
	
	    public TestObject getmObject() {
	        return mObject;
	    }
	
	    public void setmObject(TestObject mObject) {
	        this.mObject = mObject;
	    }
	
	    public int getmId() {
	        return mId;
	    }
	
	    public void setmId(int mId) {
	        this.mId = mId;
	    }
	
	    public String getmName() {
	        return mName;
	    }
	
	    public void setmName(String mName) {
	        this.mName = mName;
	    }
	
	    @NonNull
	    @NotNull
	    @Override
	    protected Object clone() throws CloneNotSupportedException {
	        User out = null;
	        try {
	            out = (User) super.clone();
	            //深拷贝
	            out.mObject = (TestObject) mObject.clone();
	        }catch (CloneNotSupportedException e){
	            e.printStackTrace();
	        }
	        return out;
	    }
	
	}

六、总结

原型模式固然有其优点,例如可以绕过繁琐的构造函数,从而快速创建对象。但是缺点也一样很明显,那就是会产生多个对象,而每个对象都需要分配内存,关于取舍需要按照业务和产品需求来决定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值