享元模式:运用共享技术有效的支持大量细粒度的对象。
抽象实例
Flyweight.java
public abstract class Flyweight {
/**
* 通过这个接口flyweight可以接受并作用于外部状态
* @param extrinsicstate 外在状态
*/
public abstract void operation(int extrinsicstate);
}
class ConcreteFlyweight extends Flyweight{
@Override
public void operation(int extrinsicstate) {
System.out.println("具体的Flyweight"+extrinsicstate);
}
}
class UnsharedFlyweight extends Flyweight{
@Override
public void operation(int extrinsicstate) {
System.out.println("不共享的具体的Flyweight"+extrinsicstate);
}
}
FlyweightFactory.java
import java.util.HashMap;
/**
* @author zhu_xiang
* Description:根据String来返回Flyweight对象
*/
public class FlyweightFactory {
private HashMap flyweights=new HashMap();
public FlyweightFactory(){
flyweights.put("X", new ConcreteFlyweight());
flyweights.put("Y", new ConcreteFlyweight());
flyweights.put("Z", new ConcreteFlyweight());
}
public Flyweight getFlyweight(String key){
return (Flyweight)flyweights.get(key);
}
}
Test.java
public class Test {
public static void main(String[] args) {
int extrinsicstate=22;
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight fx=flyweightFactory.getFlyweight("X");
fx.operation(--extrinsicstate);
Flyweight fy=flyweightFactory.getFlyweight("Y");
fy.operation(--extrinsicstate);
Flyweight fz=flyweightFactory.getFlyweight("Z");
fz.operation(--extrinsicstate);
UnsharedFlyweight unsharedFlyweight = new UnsharedFlyweight();
unsharedFlyweight.operation(--extrinsicstate);
}
}
输出
实例:网站共享代码
WebSite.java
public abstract class WebSite {
/**
* 通过这个接口接受外部状态
*/
public abstract void use();
}
class ConcreteWebSite extends WebSite{
String name="";
public ConcreteWebSite(String name) {
this.name=name;
}
@Override
public void use() {
System.out.println("网站分类:"+name);
}
}
WebSitefactory.java
import java.util.Hashtable;
public class WebSiteFactory {
private Hashtable flyweights=new Hashtable();
/**
* 获得网站分类
*/
public WebSite getWebSiteCatagory(String key){
//如果不存在实例则创建一个实例,实现复用
if(!flyweights.containsKey(key)){
flyweights.put(key, new ConcreteWebSite(key));
}
return (WebSite)flyweights.get(key);
}
/**
* 获得网站总数
*/
public int getWebSiteCount(){
return flyweights.size();
}
}
Test.java
public class Test {
public static void main(String[] args) {
WebSiteFactory webSiteFactory = new WebSiteFactory();
WebSite fx = webSiteFactory.getWebSiteCatagory("产品展示");
fx.use();
WebSite fy = webSiteFactory.getWebSiteCatagory("产品展示");
fy.use();
WebSite fz = webSiteFactory.getWebSiteCatagory("产品展示");
fz.use();
WebSite f1 = webSiteFactory.getWebSiteCatagory("博客");
f1.use();
WebSite f2 = webSiteFactory.getWebSiteCatagory("博客");
f2.use();
WebSite f3 = webSiteFactory.getWebSiteCatagory("博客");
f3.use();
System.out.println("网站分类总数:"+webSiteFactory.getWebSiteCount());
}
}
输出
实例:网站共享
内部状态/外部状态:在享元对象的内部不会随环境的改变而改变的共享部分,称为享元对象的内部状态。而随着环境的变化而改变的,不可以共享的状态就是外部状态。
User.java-非共享部分
public class User {
private String name;
public User(String name){
this.name=name;
}
public String getName() {
return name;
}
}
WebSite.java
package zx.flyweightpattern.test3;
public abstract class WebSite {
/**
* 使用的方法需要传递User对象
* @param user
*/
public abstract void use(User user);
}
class ConcreteWebSite extends WebSite{
private String name="";
public ConcreteWebSite(String name){
this.name=name;
}
@Override
public void use(User user) {
System.out.println("网站分类:"+name+" 用户:"+user.getName());
}
}
WebSiteFactory.java
import java.util.Hashtable;
public class WebSiteFactory {
private Hashtable flyweights=new Hashtable();
//获得网站分类
public WebSite getWebSiteCatagory(String key){
if(!flyweights.containsKey(key)){
flyweights.put(key,new ConcreteWebSite(key));
}
return (WebSite)flyweights.get(key);
}
//获取网站总类数
public int getWebSiteCount(){
return flyweights.size();
}
}
Test.java
package zx.flyweightpattern.test3;
public class Test {
public static void main(String[] args) {
WebSiteFactory webSiteFactory = new WebSiteFactory();
WebSite f1 = webSiteFactory.getWebSiteCatagory("产品展示");
f1.use(new User("小明"));
WebSite f2 = webSiteFactory.getWebSiteCatagory("产品展示");
f2.use(new User("小王"));
WebSite f3 = webSiteFactory.getWebSiteCatagory("产品展示");
f3.use(new User("小方"));
WebSite f4 = webSiteFactory.getWebSiteCatagory("博客");
f4.use(new User("小明"));
WebSite f5 = webSiteFactory.getWebSiteCatagory("博客");
f5.use(new User("小强"));
WebSite f6 = webSiteFactory.getWebSiteCatagory("购物");
f6.use(new User("小东"));
System.out.println("得到网站分类总数:"+webSiteFactory.getWebSiteCount());
}
}
输出