享元模式:
运用共享技术有效地支持大量细粒度的对象。
// 网站抽象类
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个空位可以放棋子,那如果用常规的面向对象来编程,每盘棋都可能有两三百个棋子对象产生,一台服务器就很难支持更多的玩家玩围棋游戏了,毕竟内存空间是有限的,如果用享元模式来处理棋子,那么棋子对象就可以减少到只有两个实例。
分享到:
相关推荐
大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf
设计模式之《大话设计模式》.pptx
享元模式 代理模式 行为模式(类行为模式) 解释器模式 模板方法模式 行为模式(对象行为模式) 策略模式 观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - ...
Android之大话设计模式——:抽象工厂模式借鉴.pdf
大话设计模式 完整设计模式介绍
《大话设计模式》C++实现-design-patterns-cpp
《大话设计模式》对各种设计模式,做简要归纳(原创)
读书笔记:大话设计模式C++
android之大话设计模式.pdf
二十三种设计模式二十三种设计模式二十三种设计模式
树懒自己整理的大话设计模式的修行笔记,对程序设计有很大的帮助,主要是以自己学习的习惯整理的!
读书笔记:设计模式大话设计模式
大话设计模式之外观模式 经典代码 C#类
单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...
android之大话设计模式整理.pdf
大话设计模式源代码之简单工厂模式 经典代码
以上只是设计模式中的一部分,"大话模式源代码示例"涵盖的28个实例将覆盖更多的模式,如命令模式、职责链模式、状态模式、访问者模式等。通过这些源代码,我们可以深入理解每个模式的工作原理,学习如何在实际项目中...
26种设计模式还包括其他如建造者模式、组合模式、享元模式、命令模式、模板方法模式、迭代器模式、访问者模式、备忘录模式、状态模式、解释器模式等,它们都有各自独特的作用和应用场景。掌握这些设计模式能够帮助...
读书笔记:设计模式学习《大话设计模式》
"大话西游之设计模式_从猴王学艺看Decorator"这篇文章将设计模式的概念与经典电影《大话西游》中的故事相结合,以生动有趣的方式讲解了Decorator模式。猴王学艺的过程,就如同我们在编程中逐步增加对象的能力,通过...