享元模式:
运用共享技术有效地支持大量细粒度的对象。
// 网站抽象类
public abstract class WebSite {
public abstract void use(User u);
}
// 具体网站类
public class ConcreteWebSite extends WebSite {
private String name;
public ConcreteWebSite(String name) {
this.name = name;
}
@Override
public void use(User u) {
System.out.println("the type of Website: " + name + ", user: " + u.getName());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 产生网站的工厂
public class WebSiteFactory {
private Map<String, WebSite> flyWeights = new HashMap<String, WebSite>();
// this is the key method ,it confirm that there is only one instance of the same website.
public WebSite getWebSiteCategory(String key) {
if (!flyWeights.containsKey(key)) {
flyWeights.put(key, new ConcreteWebSite(key));
}
return flyWeights.get(key);
}
public int getWebSiteCount() {
return flyWeights.size();
}
}
// 用户类
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 客户端
public class FlyWeightMain {
public static void main(String[] args) {
WebSiteFactory wf = new WebSiteFactory();
WebSite webSite1 = wf.getWebSiteCategory("show product");
webSite1.use(new User("Lincoln"));
WebSite webSite2 = wf.getWebSiteCategory("Blog");
webSite2.use(new User("Lincoln"));
WebSite webSite3 = wf.getWebSiteCategory("Blog");
webSite3.use(new User("Jim6"));
WebSite webSite4 = wf.getWebSiteCategory("Blog");
webSite4.use(new User("Kenny"));
System.out.println("total website: " + wf.getWebSiteCount());
}
}
什么时候用享元模式:
1. 如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销就应该考虑使用。
2. 对象的大多数状态为外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
具体应用:
围棋和五子棋只有黑白两色,所以颜色应该是棋子的内部状态,而各个棋子之间的差别主要就是位置的不同,所以方位坐标应该是棋子的外部状态,对于围棋,一盘棋理论上有361个空位可以放棋子,那如果用常规的面向对象来编程,每盘棋都可能有两三百个棋子对象产生,一台服务器就很难支持更多的玩家玩围棋游戏了,毕竟内存空间是有限的,如果用享元模式来处理棋子,那么棋子对象就可以减少到只有两个实例。
分享到:
相关推荐
Android之大话设计模式——:抽象工厂模式借鉴.pdf
享元模式 代理模式 行为模式(类行为模式) 解释器模式 模板方法模式 行为模式(对象行为模式) 策略模式 观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - ...
《大话设计模式》对各种设计模式,做简要归纳(原创)
二十三种设计模式二十三种设计模式二十三种设计模式
android之大话设计模式.pdf
树懒自己整理的大话设计模式的修行笔记,对程序设计有很大的帮助,主要是以自己学习的习惯整理的!
大话设计模式之外观模式 经典代码 C#类
android之大话设计模式整理.pdf
大话设计模式源代码之简单工厂模式 经典代码
NULL 博文链接:https://helei050.iteye.com/blog/2086309
大话设计模式 完整设计模式介绍
Android之大话设计模式——:抽象工厂模式参考.pdf
大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf
NULL 博文链接:https://linxingliang.iteye.com/blog/1217811
大话设计模式之代理模式 经典代码 C#类
设计模式之《大话设计模式》.pptx
大话设计模式源代码之策略模式 经典代码 C#类
Android之大话设计模式:抽象工厂模式终稿.pdf
这是之前上传的大话设计模式书籍的对应程序,欢迎下载和阅读 这是之前上传的大话设计模式书籍的对应程序,欢迎下载和阅读