文章目录
- 前言
- 一、享元模式基本介绍
- 二、享元模式解决网站展现项目
- 完整代码
- WebSite 抽象网站类
- User 外部状态用户
- 内部状态网站 ConcreteWebSite
- 网站工厂产生网站和负责共享(池) WebSiteFactory
- Clint 测试
- 三、享元模式在JDK-Interger的应用源码分析
- 四、享元模式的注意事项和细节
前言
`
一、享元模式基本介绍
二、享元模式解决网站展现项目
完整代码
WebSite 抽象网站类
package tanchishell.SJMS.flyweight;
public abstract class WebSite {
//User是外部状态,随着网站的类型不同,用户也就不同
public abstract void use(User user);//抽象方法
}
User 外部状态用户
package tanchishell.SJMS.flyweight;
public class User {
private String name;
public User(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
内部状态网站 ConcreteWebSite
package tanchishell.SJMS.flyweight;
//具体网站
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());
}
}
网站工厂产生网站和负责共享(池) WebSiteFactory
package tanchishell.SJMS.flyweight;
import java.util.HashMap;
// 网站工厂类,根据需要返回一个网站(网站为内部状态)
public class WebSiteFactory {
//集合, 充当池的作用
private HashMap<String, ConcreteWebSite> pool = new HashMap<>();
//根据网站的类型,返回一个网站, 如果没有就创建一个网站,并放入到池中,并返回
public WebSite getWebSiteCategory(String type) {
if (!pool.containsKey(type)) {
//就创建一个网站,并放入到池中
pool.put(type, new ConcreteWebSite(type));
}
return (WebSite) pool.get(type);
}
//获取网站分类的总数 (池中有多少个网站类型)
public int getWebSiteCount() {
return pool.size();
}
}
Clint 测试
package tanchishell.SJMS.flyweight;
public class Client {
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());
}
}
输出
网站的发布形式为:新闻 在使用中 .. 使用者是tom
网站的发布形式为:博客 在使用中 .. 使用者是jack
网站的发布形式为:博客 在使用中 .. 使用者是smith
网站的发布形式为:博客 在使用中 .. 使用者是king
网站的分类共=2
三、享元模式在JDK-Interger的应用源码分析
会创建一个 (-128 ----- 127) 的Interger 数组,调用 valueOf 就先从数组中拿Interger 对象,没有再去 new Interger 对象