网站推广平台有哪些,手机在线制作图片,四川简阳建设局招标公告网站,做网站 用虚拟服务器iis享元模式
1.享元模式含义
享元模式#xff0c;运用共享技术有效地支持大量细粒度的对象。
其实享元模式很好理解#xff0c;就是共享元数据的意思。比如一个小狗类对象#xff0c;里面的属性有头#xff0c;耳朵#xff0c;眼睛#xff0c;毛色这几个属性#xff0c;…享元模式
1.享元模式含义
享元模式运用共享技术有效地支持大量细粒度的对象。
其实享元模式很好理解就是共享元数据的意思。比如一个小狗类对象里面的属性有头耳朵眼睛毛色这几个属性然后需要实例化几个小狗对象出来但是这几个小狗对象的头、耳朵、眼睛属性值都是相同的只有毛色是不一样的那么这种情况下这几个小狗属性就可以共用一个bean的头、耳朵、眼睛属性然后再各自重新实现自己的不同的毛色属性值。这样的共用基础元数据的模式就叫享元模式。
2.代码示例
下面以用户登录网站的代码作为示例讲解享元模式
2.1User类
public class User {private String name;public User(String name) {this.name name;}public String getName() {return name;}
}2.2WebSite类
WebSite是网站抽象类定义了一个展示当前登录用户的抽象方法
public abstract class WebSite {public abstract void user(User user);
}2.3ConcreteWebSite类
ConcreteWebSite是WebSite的具体实现类
public class ConcreteWebSite extends WebSite{private String name;public ConcreteWebSite(String name) {this.name name;}Overridepublic void user(User user) {System.out.println(网站分类 name 用户 user.getName());}
}2.4WebSiteFactory类
WebSiteFactory类是WebSIte的工厂类负责为客户端生成WebSite子类对象
public class WebSiteFactory {private MapString, WebSite webSiteMap new HashMap();public WebSite getWebSiteCategory(String name){if (!webSiteMap.containsKey(name)) {webSiteMap.put(name, new ConcreteWebSite(name));}return webSiteMap.get(name);}public int getWebSiteCount(){return webSiteMap.size();}
}2.5测试类
public class MainApp {public static void main(String[] args) {WebSiteFactory factory new WebSiteFactory();WebSite bilibili factory.getWebSiteCategory(哔哩哔哩);bilibili.user(new User(秋秋));WebSite bilibili2 factory.getWebSiteCategory(哔哩哔哩);bilibili2.user(new User(张三));WebSite bilibili3 factory.getWebSiteCategory(哔哩哔哩);bilibili3.user(new User(李四));WebSite csdn factory.getWebSiteCategory(CSDN);csdn.user(new User(王五));WebSite csdn1 factory.getWebSiteCategory(CSDN);csdn1.user(new User(领克03));System.out.println(网站实例对象个数为 factory.getWebSiteCount());}
}运行结果 网站分类哔哩哔哩用户秋秋 网站分类哔哩哔哩用户张三 网站分类哔哩哔哩用户李四 网站分类CSDN用户王五 网站分类CSDN用户领克03 网站实例对象个数为2 从运行结果可以看出一共有3五个用户登录了网站但是最终网站的实例对象个数仅为2也就是说登录哔哩哔哩网站的用户共享了哔哩哔哩网站实例对象登录CSDN网站的用户共享了CSDN网站实例对象。这就是享元模式五个用户分别共享了两个网站的实例对象。
如果没有使用享元模式那么五个对象登录网站就要实例化五个网站对象但是如果真的实例化五个网站对象的话就是浪费内存空间了因为这五个网站对象完全一模一样仅仅是登录的用户名称不一样改为享元模式用户共享网站实例对象这样就可以节省很大的内存开销了。
3.总结
享元模式里面涉及到两个概念内部状态与外部状态
内部状态内部状态就是在享元对象内部并且不会岁环境改变而改变的部分比如ConcreteWebSite类中的name属性可以认为是内部状态虽然它的值也会被改变但是相对来说被改变的几率比较小可以认为是内部状态外部状态外部状态跟内部状态相反它是随着环境的改变而改变。不可以共享的状态就是外部状态比如ConcreteWebSite类的User对象
如果一个应用程序使用了大量的对象而大量的这些对象造成了很大的存储开销时就应该考虑使用享元模式还有救赎对象的大多数状态可以为外部状态。
如果删除对象的外部状态那么可以用相对较少的共享对象取代很多组对象此时可以考虑使用享元模式。