享元模式与组合模式(1)

简介: 享元模式与组合模式(1)

一、享元模式定义


享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于 享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种 对象结构型模式。


image.png


image.png


模式所涉及的角色

 Flyweight: 享元接口,通过这个接口传入外部状态并作用于外部状态;

 ConcreteFlyweight: 具体的享元实现对象,必须是可共享的,需要封装享元对象的内部状态;

 UnsharedConcreteFlyweight: 非共享的享元实现对象,并不是所有的享元对象都可以共享,非共享的享元对象通常是享元对象的组合对象;

 FlyweightFactory: 享元工厂,主要用来创建并管理共享的享元对象,并对外提供访问共享享元的接口;


二、单纯享元模式

单纯享元模式:在单纯享元模式中,所有的享元对象都是可以共享的,即所有抽象享元类的子类都可共享,不存在非共享具体享元类。


image.png


//抽象享元角色类


public interface Flyweight {
    //一个示意性方法,参数state是外蕴状态
    public void operation(String state);
}


//具体享元角色类


//具体享元角色类ConcreteFlyweight有一个内蕴状态,在本例中一个Character类型的intrinsicState属性代表,它的值应当在享元对象


//被创建时赋予。所有的内蕴状态在对象创建之后,就不会再改变了。如果一个享元对象有外蕴状态的话,所有的外部状态都必须存储在客户端,


//在使用享元对象时,再由客户端传入享元对象。这里只有一个外蕴状态,operation()方法的参数state就是由外部传入的外蕴状态。


public class ConcreteFlyweight implements Flyweight {
    private Character intrinsicState = null;
    /**
     * 构造函数,内蕴状态作为参数传入
     * @param state
     */
    public ConcreteFlyweight(Character state){
        this.intrinsicState = state;
    }
    /**
     * 外蕴状态作为参数传入方法中,改变方法的行为,
     * 但是并不改变对象的内蕴状态。
     */
    @Override
    public void operation(String state) {
        // TODO Auto-generated method stub
        System.out.println("Intrinsic State = " + this.intrinsicState);
        System.out.println("Extrinsic State = " + state);
    }
}


//享元工厂角色类

//享元工厂角色类,必须指出的是,客户端不可以直接将具体享元类实例化,而必须通过一个工厂对象,利用一个factory()方法得到享元对象。

//一般而言,享元工厂对象在整个系统中只有一个,因此也可以使用单例模式。


//当客户端需要单纯享元对象的时候,需要调用享元工厂的factory()方法,并传入所需的单纯享元对象的内蕴状态,由工厂方法产生所需要的

//享元对象。


public class FlyweightFactory {
    private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();
    public Flyweight factory(Character state){
        //先从缓存中查找对象
        Flyweight fly = files.get(state);
        if(fly == null){
            //如果对象不存在则创建一个新的Flyweight对象
            fly = new ConcreteFlyweight(state);
            //把这个新的Flyweight对象添加到缓存中
            files.put(state, fly);
        }
        return fly;
    }
}


//客户端类


public class Client {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight fly = factory.factory(new Character('a'));
        fly.operation("First Call");
        fly = factory.factory(new Character('b'));
        fly.operation("Second Call");
        fly = factory.factory(new Character('a'));
        fly.operation("Third Call");
    }
}


虽然客户端申请了三个享元对象,但是实际创建的享元对象只有两个,这就是共享的含义。运行结果如下:


image.png

目录
相关文章
|
3月前
|
设计模式 存储 数据库连接
何时使用享元模式
【8月更文挑战第22天】
25 0
|
6月前
|
Java 数据库
享元模式~
享元模式~
|
6月前
|
存储 安全
结构型 组合模式
结构型 组合模式
30 0
|
存储 设计模式 缓存
2023-6-28-第十式享元模式
2023-6-28-第十式享元模式
88 0
|
设计模式 缓存 前端开发
关于享元模式我所知道的
关于享元模式我所知道的
68 0
|
前端开发
关于组合模式我所知道的
关于组合模式我所知道的
56 0
|
存储 缓存 Java
结构型模式-享元模式
结构型模式-享元模式
121 0
|
存储 设计模式 安全
结构型模式-组合模式
结构型模式-组合模式
88 0
|
设计模式 缓存 Java
我学会了,享元模式
享元模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。
160 0
我学会了,享元模式
|
设计模式
我学会了,组合模式
组合模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。
109 0
我学会了,组合模式