享元模式定义:运用共享技术有效地支持大量细粒度地对象。
初步理解:代码的共享,不同的用户使用时,存在不同的数据,因此在调用方法时传入封装用户信息的对象即可。
code…
每件体育用品的功能是相同的,因此体育用品是共享的,但是使用体育用品的人是不一样的。 体育用品的基类:
public interface ShareSport {
public void sport(User user);
}
乒乓球的实现类:
public class PingPang implements ShareSport {
@Override public void sport(User user) {
System.out.println(user.getName()+"正在使用乒乓球");
}
}
其他两个实现类与此类似。
工厂类,如果有某件体育用品,直接将其返回,如果没有这件,通过反射新建一个然后添加到hashmap中然后返回。
public class Factory {
private HashMap<String,ShareSport> hashMap=new HashMap<>();
public ShareSport createObject(String string)
{
if(!hashMap.containsKey(string)) {
ShareSport obj = null;
try {
string = "com.Flyweight." + string;
Class clazz = Class.forName(string);
obj = (ShareSport) clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
hashMap.put(string, obj);
}
return hashMap.get(string);
}
用户类:
public class User {
private String name;
//构造、get、set省略
}
main方法:
public class Main {
public static void main(String[] args) {
Factory factory=new Factory();
ShareSport pingpang=factory.createObject("PingPang");
pingpang.sport(new User("Yang"));
ShareSport pingpang2=factory.createObject("PingPang");
pingpang.sport(new User("Song"));
ShareSport valleyball=factory.createObject("Valleyball");
valleyball.sport(new User("Yang"));
factory.getSize();
}
}
在这个实例中,User可以看做是外部状态,运动器材可以看做是内部状态。内部状态是可以共享的。在设计中,如果发现有很多对象除了少数参数不一样其余都相同的时候,可以将少数参数分离到类外,相同的部分拿来共享。当调用方法时,再将参数传入。
比如上例:没有必要人手一把乒乓球,可以买上几分大家共享,需要打篮球发现没有时,再去买。不管是谁打乒乓球,乒乓球的作用都是被打。要体现出打的人不同,就要在调用方法是将用户传入。
上一篇 |
---The End---
| 下一篇 |