Design Pattern: Flyweight(享元模式)

虚拟空间(主机)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");
  }
} 


接着定义一个享元工厂(由工厂模式的定义可知,工厂就是一个用来产生对象并返回对象的方法)。由于享元的初衷就是节约产生对象的开销,尽可能地以有限的内部状态对象应对万变的外部状态请求(一种以不变应万变的思想)。所以,我们在工厂类中首先判断该享元对象是否已经被创建,如果是,则返回已经创建的对象。否则,创建新的享元对象并返回。是不是感觉很单例模式很想?没错,这里的享元工厂方法就是一个单例模式的应用,不过它返回的不是它自己的对象,也不是保证自己对象只产生一次。所以,它并不是简单的把构造函数设成private等构造单例类的方法。是利用调用者的机制确保单例的,当然,其实这种情况也可以把上述两个类定义变成单例模式的。


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);
    }
}

于是,每次客户端需要请求对象时,从工厂类请求对应的享元对象,然后调用享元对象的方法输入外部状态达到想要的效果。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值