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."; } }