本文主要是介绍大话设计模式——14.享元模式(Flyweight Pattern),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简介
尝试重用现有的同类对象,未找到匹配的对象,则创建新对象。它提供了减少对象数量从而改善应用所需的对象结构的方式
UML图:
应用场景:
- Java的String类型数据,字符串常量池中存在则并返回,没有则创建字符串并保存在字符串常量池中
- 系统中存在大量相似对象,需要进行池化的时候,如数据库连接池、线程池等
- 需要生成大量的细粒度的实例,且实例大体相似
示例
- 抽象享元对象
public abstract class Website {public abstract void use(Business business);
}
public class Business {/*** 商家名称*/private String name;public Business(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
- 具体享元对象:
public class ConcretWebsite extends Website{private String category;public ConcretWebsite(String category) {this.category = category;}@Overridepublic void use(Business business) {System.out.println("网站类型:"+this.category+" 网站名称"+business.getName());}
}
- 享元工厂
public class WebsiteFactory {private Map<String, Website> websiteMap = new HashMap<>();/*** 获取网站** @param category* @return*/public Website getWebsite(String category) {if (websiteMap.containsKey(category)) {return websiteMap.get(category);} else {ConcretWebsite concretWebsite = new ConcretWebsite(category);websiteMap.put(category, concretWebsite);return concretWebsite;}}/*** 获取网站数量** @return*/public int getCount() {return websiteMap.size();}
}
- 运行
public class Main {public static void main(String[] args) {WebsiteFactory websiteFactory = new WebsiteFactory();Website website = websiteFactory.getWebsite("外卖小程序");website.use(new Business("蜜雪"));website.use(new Business("烧仙草"));Website website1 = websiteFactory.getWebsite("博客");website1.use(new Business("财经"));website1.use(new Business("地理"));System.out.println("网站个数:" + websiteFactory.getCount());}
}
总结
-
优点
- 可以减少对象的创建,减少程序内存的占用,提高系统性能
-
缺点
- 增加了系统的复杂性
- 必须有一个工厂类加以控制
VS 原型、单例模式
- 原型模式指定创建对象的种类,通过拷贝这些原型创建新对象,本质拷贝一次创建一个新对象
- 单例模式保证一个类仅有一个对象创建
这篇关于大话设计模式——14.享元模式(Flyweight Pattern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!