享元(Flyweight)模式

package JAVABasic;

import java.util.ArrayList;
import java.util.Collection;
/**
 * 享元模式的核心思想就是将内部状态相同的对象在存储时进行缓存。
 * 也就是说同一颜色同一尺寸的皮鞋,我们在内存中只保留一份实例,
 * 在访问对象时,我们访问的其实是对象缓存的版本,而不是每次都重新生成对象。
 * @author markGao
 *
 */
public class FlyweightMode {
    public static void main(String[] args) {

        Shoe shoe = ShoeFactory.getInstance().getSheo("BLACK", 42, "A");
        System.out.print(shoe.toString());
    }
    
    
}
/**
 * 由于享元模式禁止生成新的对象,所以在使用享元模式时,通常伴随着工厂方法的应用。
 * @author markGao
 *
 */
class ShoeFactory {
    private static ShoeFactory sf = null;
    private ShoeFactory() {
        
    }
    public static ShoeFactory getInstance(){
        if(null == sf){
            sf = new ShoeFactory();
        }
        return sf;
    }

    Collection<Shoe> shoes = new ArrayList<Shoe>();

    public Shoe getSheo(String color, int size, String position) {
        if(!shoes.isEmpty()) {
            // 首先在缓存中查找对象
            for (Shoe shoe : shoes) {
                if (null == shoe) {
                    continue;
                }
                if (shoe.getColor() == color && shoe.getSize() == size) {
                    // 在缓存中命中对象后还原对象的外部属性
                    shoe.setPosition(position);
                    return shoe;
                }
            }
        }
        
        // 如果缓存未命中则新建对象并加入缓存
        Shoe shoe = new Shoe();
        shoe.setColor(color);
        shoe.setSize(size);
        shoe.setPosition(position);
        shoes.add(shoe);
        return shoe;
    }
}

class Shoe {

    /**
     * 其中颜色和尺寸为皮鞋的自然状态,我们称之为对象内部状态,
     * 这些状态数据只与对象本身有关,不随外界环境的改变而发生变化。
     */
    private String color;
    private int size;
    /**
     * 来看库存位置,我们将这个状态称为对象的外部状态,
     * 外部状态与对象本身无必然关系,外部状态总是因为外界环境的改变而变化,
     * 也就是说外部状态是由外界环境来决定的。
     * 在本例中,皮鞋今天放在A仓库,明天可能放在B仓库,但无论存放在哪个仓库,
     * 同一只皮鞋就是同一只皮鞋,
     * 它的颜色和尺寸不会随着存放位置的不同而发生变化。
     */
    private String position;
    
    public Shoe(){
        
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }
    
    public String toString() {
        return "The shoe color is: " + color + "; The shoe size is: " + size
                + "; The shoe position is in " + position + " Area.";

    }

}


你可能感兴趣的:(享元(Flyweight)模式)