当前位置: 首页 > 后端技术 > Java

原型模式

时间:2023-04-01 23:04:45 Java

目录定义实现使用场景定义使用原型实例创建对象实例,然后通过复制这些原型来创建新的对象。在java中,主要是通过原型实现Cloneable接口,然后通过clone方法将原型实例复制到客户端,从而实现原型模式的目的。那么有什么好处呢?创建对象主要就是申请内存+成员变量赋值。在系统中,这个开销可以忽略不计,所以一般不推荐使用原型模式。但是如果每次创建对象都需要加载文件、加解密等操作,这些操作占用的时间和资源都比较多,而且每次加载的内容都差不多,那么我们可以考虑使用原型模式这次。实现下面通过一个创建数据库连接的类来体验一下原型模式的实现。首先,有一个数据库配置文件,里面包含了主从节点的配置。我们需要加载相关的配置文件,然后复制返回给客户端的连接类实例。主从配置文件config.propertiesmaster.ip=localhostmaster.port=3306master.username=rootmaster.password=123456master.type=mysqlslave.ip=localhostslave.port=3307slave.username=rootslave.password=123456slave.type=mysqlConnection——所有数据库连接的父类实现连接类的主要工作,如加载主配置文件MasterConnection&SlaveConnection-细化不同节点的数据库连接并实现原型复制静态{属性=新属性();InputStreamin=null;尝试{in=newFileInputStream("config.properties");属性.load(in);}catch(IOExceptione){e.printStackTrace();}finally{try{assertin!=null;附寄();}catch(IOExceptione){e.printStackTrace();}}}私有字符串ip;私有字符串端口;私有字符串用户名;私人海峡输入密码;私有字符串类型;publicStringgetIp(){返回ip;}voidsetIp(Stringip){this.ip=ip;}publicStringgetPort(){返回端口;}voidsetPort(Stringport){this.port=port;}publicStringgetUsername(){返回用户名;}voidsetUsername(Stringusername){this.username=username;}publicStringgetPassword(){返回密码;}voidsetPassword(Stringpassword){this.password=password;}publicStringgetType(){返回类型;}voidsetType(Stringtype){this.type=type;}@OverrideprotectedObjectclone()抛出CloneNotSupportedException{returnsuper.clone();}}publicclassMasterConnectionextendsConnection{privatestaticfinalConnectionCONNECTION=newMasterConnection();static{CONNECTION.setIp(properties.getProperty("master.ip&quo吨;));CONNECTION.setPort(properties.getProperty("master.port"));CONNECTION.setUsername(properties.getProperty("master.username"));CONNECTION.setPassword(properties.getProperty("master.password"));CONNECTION.setType(properties.getProperty("master.type"));}publicstaticConnectiongetConnection()抛出CloneNotSupportedException{return(Connection)CONNECTION.clone();}}publicclassSlaveConnectionextendsConnection{privatestaticfinalConnectionCONNECTION=newSlaveConnection();static{CONNECTION.setIp(properties.getProperty("slave.ip"));CONNECTION.setPort(properties.getProperty("slave.port"));CONNECTION.setUsername(properties.getProperty("slave.username"));CONNECTION.setPassword(properties.getProperty("slave.password"));CONNECTION.setType(properties.getProperty("slave.type"));}publicstaticConnectiongetConnection()throwsCloneNotSupportedException{return(Connection)CONNECTION.clone();}}TestpublicclassPrototypeTest{@Testpublicvoidtest(){try{Connectionconnection=MasterConnection.getConnection();System.out.println(connection.getPort());connection=SlaveConnection.getConnection();System.out.println(connection.getPort());}catch(CloneNotSupportedExceptione){e.printStackTrace();}}}=======Result=======33063307使用场景资源优化场景:创建对象时需要初始化大量外部资源复杂依赖场景:对象A待created依赖对象B和对象C,对象B依赖对象D...同一个对象会被多个修饰符使用的场景:一个商品可能被用于订单、物流、会员等多种服务。保存原来的状态:就比如上面的Connection类中,我们需要保存从文件加载的配置