设计模式之十享元模式
基本介绍
1) 享元模式(Flyweight Pattern) 也叫 蝇量模式: 运 用共享技术有效地支持大量细粒度的对象
2) 常用于系统底层开发,解决系统的性能问题。像 数据库连接池,里面都是创建好的连接对象,在 这些连接对象中有我们需要的则直接拿来用,避 免重新创建,如果没有我们需要的,则创建一个
3) 享元模式能够解决重复对象的内存浪费的问题, 当系统中有大量相似对象,需要缓冲池时。不需 总是创建新对象,可以从缓冲池里拿。这样可以 降低系统内存,同时提高效率
4) 享元模式经典的应用场景就是池技术了,String常 量池、数据库连接池、缓冲池等等都是享元模式 的应用,享元模式是池技术的重要实现方式
uml类图
案例
1) 应用实例要求 使用享元模式完成,前面提出的网站外包问题
uml类图
代码实现
package com.hy.flyweight; /** * @author hanyong * @date 2020/11/24 1:14 */ public abstract class Website { public abstract void use(User user); } package com.hy.flyweight; /** * @author hanyong * @date 2020/11/24 1:16 */ 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()); } } package com.hy.flyweight; import lombok.Getter; import lombok.Setter; /** * @author hanyong * @date 2020/11/24 1:29 */ public class User { @Getter @Setter private String name; public User(String name) { this.name = name; } } package com.hy.flyweight; import java.util.HashMap; /** * @author hanyong * @date 2020/11/24 1:19 */ public class WebSiteFactory { private HashMap<String, Website> pool = new HashMap<>(); public Website getWebsite(String type) { if (!pool.containsKey(type)) { pool.put(type, new ConcreteWebSite(type)); } return pool.get(type); } public int getCount() { return pool.size(); } } package com.hy.flyweight; /** * @author hanyong * @date 2020/11/24 1:22 */ public class Client { public static void main(String[] args) { WebSiteFactory webSiteFactory = new WebSiteFactory(); Website website = webSiteFactory.getWebsite("微博"); website.use(new User("佳佳")); Website website1 = webSiteFactory.getWebsite("微博"); website1.use(new User("lili")); Website website2= webSiteFactory.getWebsite("微信"); website2.use(new User("huanghuang")); System.out.println(webSiteFactory.getCount()); } }