设计模式十五————享元模式

享元模式定义:运用共享技术有效地支持大量细粒度地对象。
初步理解:代码的共享,不同的用户使用时,存在不同的数据,因此在调用方法时传入封装用户信息的对象即可。

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 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---
下一篇

你可能感兴趣的:(享元模式,设计模式,设计模式)