享元模式
定义:运用共享技术有效的支持大量细粒度的对象
举一个常见运用享元模式的例子,在博客平台上每个人都可以注册拥有一个自己的博客,那么博客平台是否为我们每个人都生成不同的博客文章表呢,我们的用户信息是否是存放在一起的呢?答案是是的。我们个人博客上有很多相似之处,博客都发文章,博客界面也是类似,不同的是文章里面的内容。在享元模式中,共享代码称作享元对象,享元对象内部并且不会随着环境的改变而改变的状态称作内在状态,而我们每个人的博客账号又是不同的,登录不同的账号获取的昵称是不同的,这部分账号信息则不是共享的称作为外在状态。
使用享元对象时,内部状态储存在具体的享元对象中,外部状态由客户端(非浏览器)储存。
UML图
运用上,享元工厂以map存储享元对象,通过享元对象工厂创建享元对象,在map中有则取出,实现共享,无则创建加入map。除享元对象外还,存在非享元对象,他们以参数形式注入享元对象的方法中
/**
* @author 州牧
* @description 享元对象
* @since 2022-04-22 20:38
*/
public abstract class FlyWeight {
public abstract void operation();
public abstract void outState(User user);
}
/**
* @author 州牧
* @description
* @since 2022-04-22 20:39
*/
public class FlyWeightDemo1 extends FlyWeight{
private String name;
public FlyWeightDemo1(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void operation() {
System.out.println("我的名字:"+name);
}
@Override
public void outState(User user) {
System.out.println("外在状态用户名:"+user.getName());
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author 州牧
* @description 享元对象工厂
* @since 2022-04-22 20:37
*/
public class FlyweightFactory {
Map map = new HashMap<String,FlyWeight>();
/*获取Flyweight*/
public FlyWeight getFlyWeight(String key){
if(map.containsKey(key)){
return (FlyWeight) map.get(key);
}else{
FlyWeightDemo1 flyWeightDemo1 = new FlyWeightDemo1(key);
map.put(key,flyWeightDemo1);
return flyWeightDemo1;
}
}
}
/**
* @author 州牧
* @description 外部状态
* @since 2022-04-22 21:02
*/
public 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;
}
}
/**
* @author 州牧
* @description
* @since 2022-04-22 20:49
*/
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
FlyWeight flyWeightDemo1 = factory.getFlyWeight("共享代码一");
FlyWeight flyWeightDemo2 = factory.getFlyWeight("共享代码二");
FlyWeight flyWeightDemo3 = factory.getFlyWeight("共享代码三");
FlyWeight flyWeightDemo5 = factory.getFlyWeight("共享代码三");
flyWeightDemo1.operation();
flyWeightDemo2.operation();
flyWeightDemo3.operation();
flyWeightDemo5.operation();
//客户端创建外在状态
flyWeightDemo1.outState(new User("李华"));
flyWeightDemo2.outState(new User("张三"));
flyWeightDemo3.outState(new User("王五"));
;
//校验共享
System.out.println(flyWeightDemo3 == flyWeightDemo5);
}
}
/*
我的名字:共享代码一
我的名字:共享代码二
我的名字:共享代码三
我的名字:共享代码三
外在状态用户名:李华
外在状态用户名:张三
外在状态用户名:王五
true
*/
享元模式是减少创建大量相似类的开销。通过将少数的外部状态以参数的形式注入到享元对象的方法中而使用。