假设一个小型的外包项目,给不同的客户有不同的展示形式:
直接将网站复制多份,对不同的客户进行定制修改,使用不同的虚拟空间
/***
* @author shaofan
* @Description 享元模式解决网站发布问题
*/
public class Flyweight {
public static void main(String[] args) {
WebsiteFactory pool = new WebsiteFactory();
// 网站的用户为外部状态,跟随场景的不同改变
// 网站的类型为内部状态,创建之后存储在池中,不再改变
pool.getWebsite("微信公众号").use(new User("tom"));
System.out.println(pool.getWebsiteCount());
}
}
abstract class Website{
abstract void use(User user);
}
class ConcreteWebsite extends Website{
private String type;
public ConcreteWebsite(String type){
this.type = type;
}
@Override
void use(User user) {
System.out.println(user.getName()+"的网站的发布形式为"+type);
}
}
/***
* 网站的工厂
*/
class WebsiteFactory{
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 getWebsiteCount(){
return pool.size();
}
}
/***
* 外部状态
*/
class User {
private String name;
public User(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这里x和z是同一个对象,这是因为Integer.valueOf()方法内部使用到了一个缓冲池IntegerCache
这个缓冲池可以存储int大小在low~high之间的数,low为-128;high默认为127,可以通过虚拟机配置high的大小;缓冲池内部有一个Integer类型的数组,作为池使用存储共享的Integer对象;而超出这个范围的Integer是会直接创建一个新对象的