享元模式(结构型)
设计模式的3个分类:创建型模式、结构型模式、行为型模式
享元模式定义:
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
组合模式图示:
组合模式应用图示:
组合模式应用代码实现:
//抽象"网站" public abstract class WebSite { public abstract void use(User user);//user为享元模式中的外部状态 } //具体“网站” public class ConcreteWebSite extends WebSite { //网站发布的类型(享元模式的内部状态) private String type = ""; public ConcreteWebSite(String type) { this.type = type; } @Override public void use(User user) { System.out.println("网站的发布形式为: " + type + " 在使用中... 使用者为: " + user.getName()); } } /网站工厂类,根据需求返回网站 public class WebSiteFactory { //集合,充当池的作用 private Map<String, ConcreteWebSite> pool = new HashMap<>(); //根据网站的类型,返回一个网站;如果没有就创建一个网站,并放入到池中 public WebSite getWebSiteCategory(String type) { if (!pool.containsKey(type)) { pool.put(type, new ConcreteWebSite(type)); } return pool.get(type); } //获取网站分类的总数(池中有多少个网站类型) public int getWebSiteCount() { return pool.size(); } } //User是享元模式中的“外部状态” public class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; } } public class FlyweightPatternDemo { public static void main(String[] args) { //创建一个工厂类 WebSiteFactory factory = new WebSiteFactory(); //客户要一个以"新闻"形式发布的网站 WebSite website1 = factory.getWebSiteCategory("新闻"); website1.use(new User("Tom")); //客户要一个以"博客"形式发布的网站 WebSite website2 = factory.getWebSiteCategory("博客"); website2.use(new User("Jack")); //客户要一个以"博客"形式发布的网站 WebSite website3 = factory.getWebSiteCategory("博客"); website3.use(new User("Smith")); //客户要一个以"博客"形式发布的网站 WebSite website4 = factory.getWebSiteCategory("博客"); website4.use(new User("King")); System.out.println("网站的分类共: " + factory.getWebSiteCount());//输出内容:网站的分类共: 2 } }
应用:
1、系统有大量相似对象。2、需要缓冲池的场景。例如Java中的String,线程池、数据库链接池等。
参考:
韩顺平《设计模式》--youtube