标签:享元 WebSite name 大话 factory User new 设计模式 public
享元模式
定义
运用共享技术有效的支持大量细粒度的对象。
UML图
举个栗子
实际开发当中,一个项目如果做得好,如果市场打通到其他地方,那么核心代码其实是可以通用的,只不过用着不同的数据和特性出来的模版而已,这些对用户来说是非透明的。使用最小的开销获得最大的收益,这是所有公司的目的。
Talk is cheap, show me the code
(屁话少说,放码过来)
/**
* 网站抽象类
* Created by callmeDevil on 2019/12/15.
*/
public abstract class WebSite {
public abstract void use(User user);
}
/**
* 具体网站类
* Created by callmeDevil on 2019/12/15.
*/
public class ConcreteWebSite extends WebSite{
private String name = "";
public ConcreteWebSite(String name){
this.name = name;
}
@Override
public void use(User user) {
System.out.println("网站分类:" + name + " 用户:" + user.getName());
}
}
/**
* 网站工厂
* Created by callmeDevil on 2019/12/15.
*/
public class WebSiteFactory {
private HashMap<String, WebSite> flyweights = new HashMap<>();
// 获得网站分类
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();
}
}
/**
* 用户
* Created by callmeDevil on 2019/12/15.
*/
public class User {
private String name;
public User(String name){
this.name = name;
}
// 省略 get set
}
public class Test {
public static void main(String[] args) {
WebSiteFactory factory = new WebSiteFactory();
WebSite fx = factory.getWebSiteCategory("产品展示");
fx.use(new User("路飞"));
// 共享上方生成的对象,不再实例化
WebSite fy = factory.getWebSiteCategory("产品展示");
fy.use(new User("索隆"));
WebSite fz = factory.getWebSiteCategory("产品展示");
fz.use(new User("山治"));
WebSite fl = factory.getWebSiteCategory("博客");
fl.use(new User("娜美"));
WebSite fm = factory.getWebSiteCategory("博客");
fm.use(new User("乌索普"));
WebSite fn = factory.getWebSiteCategory("博客");
fn.use(new User("乔巴"));
// 统计实例化个数,结果应为2
System.out.println("网站分类总数为:" + factory.getWebSiteCount());
}
}
运行结果
网站分类:产品展示 用户:路飞
网站分类:产品展示 用户:索隆
网站分类:产品展示 用户:山治
网站分类:博客 用户:娜美
网站分类:博客 用户:乌索普
网站分类:博客 用户:乔巴
网站分类总数为:2
总结
好处
享元模式可以避免大量非常相似的类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本相同的,有时就能够受大幅度的减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传进来,就可以通过共享大幅度的减少单个实例的数目。
使用情景
- 如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大存储开销时就应该考虑应用
- 对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑应用。
标签:享元,WebSite,name,大话,factory,User,new,设计模式,public 来源: https://www.cnblogs.com/call-me-devil/p/12044428.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。