享原模式笔记(Java)

来源:互联网 发布:红楼梦里的建筑知乎 编辑:程序博客网 时间:2024/05/29 12:15

享原模式:运用共享技术有效的支持大量细粒度的对象。是对象型的结构模式。

享原模式能做到共享的关键是区分内蕴状态和外蕴状态。一个内部状态时存储在享原对象内部的,并且不会谁环境改变而有所不同。因此,一个享原可以具有内部状态可以共享。一个外部状态是谁环境的改变而改变的,不可以共享状态。享原对象的外部状态必须由客户端保存。外部状态和内部状态时相互独立的。

 

享原模式的参与者:抽象享原类(Flyweight),具体享原类(ConcreteFlyweight),非共享具体享原类(UnsharedConcreteFlyweight),享原工厂类(FlyweightFactory),客户端(Client)

抽象享原类(Flyweight):是所有享原类的超类或接口,通过这个接口Flyweight可以接受并作用于外部状态。抽象享原的接口使得享元变得可能,但是并不强制子类实行共享。

具体享原类(ConcreteFlyweight):实现抽象享原接口,并为内部状态(如果有的话)增加储存空间。ConcreteFlyweight是Flyweight的子类中可以共享的。并且它所储存的状态必须是内部的。

非共享具体享原类(UnsharedConcreteFlyweight):UnsharedConcreteFlyweight是不可以共享的Flyweight子类。

享原工厂类(FlyweightFactory):本类负责管理和创建Flyweight及Flyweight的子类对象的。当一个客户请求一个享原对象时,享原工厂需要检查系统中是否已经拥有一个符合要求的享原对象,如果有了,系统就提供该享原对象,如果没有则创建一个新的享原对象。

客户端(Client):需要自行存储享原对象的外部状态。 

 

Flyweight类:

public interface Flyweight{

       public abstract void Operation(String state);

}

 

ConcreteFlyweight类:

public class ConcreteFlyweight implements Flyweight{

       private Character inState=null;

       //内部状态

       public ConcreteFlyweight(Character inState){

               this.inState=inState;

       }

       //外部状态用参数传进来

       public void Operation(String outState){

              //code

       }

}

 

public class UnsharedConcreteFlyweight implements Flyweight{

       public void Operation(String outState){

              //不共享的Flyweight的操作方法

       }

}

 

class FlyweightFactory{

       private HashMap flies=new HashMap();

       public FlyweightFactory(){

         //构造函数

       }

       public Flyweight factory(Character state){

        /*根据HashMap 中是否含有处于state状态的对象来创建或返回已经存在的Flyweight 对象*/

       }

 

}

 

 

享原模式在以下情况下使用:

(1)一个应用程序使用大量的对象

(2)完全由于使用对象造成很大的内存开销

(3)对象的大多数外部状态多可以变为外部状态

(4)如果删除对象的外部状态,按照内蕴状态可以分成很多组,每一个组都可以仅用一个对象代替。那么可以使用相对较少的共享对象取代很多种组对象。

(5)系统不依赖于这些对象的身份。

原创粉丝点击