享元模式(结构型)
设计模式的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

浙公网安备 33010602011771号