虚拟空间(主机)Virtual host:是一种虚拟技术。使得同一台物理服务器可以分割出若干个虚拟服务器。以实现同一台物理服务器上,能部署多个网站。
享元模式(FlyWeight)的应用在于存在需要创建多个对象的需求,并且这些对象除了外部状态不同之外,其内部状态都是相同的。这样,我们可以创建享元类来代表这些对象的内部状态,在享元类的方法定义中,定义一个形参以接受外部状态的输入。然后,利用单例模式的思想,每个享元只创建一个对象以满足不同的外部状态的需求。可以看出,这么做在外部同时访问量不高的情况下是可行的,不然,当两个或多个请求同时请求同一种享元类的对象时,服务器只能串行满足请求了。
具体的应用场景有:
1)在一个服务器中,部署多个网站。但这些网站可以分类只有:博客和产品展示。除了对应的用户和数据不同之外,其style都是一样的,这样就可以使用享元模式以节约虚拟空间等资源。使用享元模式就可以只开辟两个虚拟空间,然后使用一个虚拟空间满足所有博客类或者产品展示类的请求。
2)更加简单的例子是围棋的应用设计。我们可以设立黑棋享元类和白棋享元类,其内部状态是:黑棋和白棋。外部状态是:下子的坐标。
使用享元类的步骤是:
设立一个享元的接口,如围棋的例子,我们设立棋作为接口:
interface Chess{
public abstract void useChess(List coordinate);
}
然后让享元类(内部状态)作为其实现类,有多少个内部状态,就有多少个实现类:
ChessBlack implements Chess{
public void useChess(List coordinates){
System.out.println("put black at" + coordinates");
}
}
ChessWhite implements Chess{
public void useChess(List coordinates){
System.out.println("put white at" + coordinates");
}
}
public class FlyWeightFactory{
HashMap<String,Chess> lookup_table = new HashMap<String, Chess>();
public Chess getInstance(String color){
if(lookup_table.get(color) == null){
if(color.equals("black"))
lookup_table.put(color, new ChessBlack);
if(color.equals("while"))
lookup_table.put(color, new ChessWhile);
}else{
return lookup_table.get(color);
}
}
于是,每次客户端需要请求对象时,从工厂类请求对应的享元对象,然后调用享元对象的方法输入外部状态达到想要的效果。