享元(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.";

    }

}
相關文章
相關標籤/搜索